iT邦幫忙

2023 iThome 鐵人賽

DAY 28
1
自我挑戰組

30天開啟.NET後端工程師的旅程系列 第 28

加強安全性 - 使用BCrypt和JWT實現強大的身分驗證

  • 分享至 

  • xImage
  •  

前言

在開發網頁的時候,會員登入是其中重要的一個部分,但是關於個人隱私的部分安全性的建立就很重要,所以才會需要在設定密碼進行加密的時候。

什麼是BCrypt?

我們在設定密碼的時候為了防止被盜,所以不會把原始密碼存到資料庫,為了可以安全的存儲密碼,防止攻擊,就會使用到BCrypt

BCrypt(Blowfish Crypt)是一種哈希函數和密碼加密算法,通常用於安全地存儲密碼。它的主要目標是增加密碼的安全性,以防止常見的攻擊,例如彩虹表攻擊。

關於BCrypt的一些重要特性和解釋:

  1. 安全性強大:BCrypt被廣泛認為是一種非常安全的密碼哈希算法,它使用了強大的加密技術,包括Blowfish加密算法。由於其安全性,它能夠有效地防止暴力攻擊、彩虹表攻擊和字典攻擊等常見的密碼破解方法。
  2. 加鹽(Salting):BCrypt在計算密碼的哈希值時,會自動生成一個隨機的加鹽(salt),然後將這個加鹽與密碼一起哈希。加鹽的作用是確保相同的原始密碼經過BCrypt處理後生成不同的哈希值,即使兩個用戶使用相同的密碼,他們的哈希值也不同,增加了攻擊者破解密碼的難度。
  3. 遞增的計算成本:BCrypt的計算成本是可配置的,通常通過參數稱為“工作因子”(work factor)來調整。增加工作因子將使計算哈希的時間更長,從而增加了攻擊者破解密碼所需的計算資源和時間。這使得BCrypt在硬件進步時仍能保持安全性。
  4. 容易集成:BCrypt的算法已經實現在多種程式語言和開發平台上,因此可以輕鬆地集成到應用程式中。例如,在C#中,您可以使用BCrypt.Net函式庫來使用BCrypt。

BCrypt是一個用於安全存儲和驗證密碼的強大工具,它通過加鹽和增加計算成本等方式,提供了優秀的防禦機制,以防止密碼泄露和破解。在開發應用程式時,使用BCrypt或類似的安全哈希算法是一個重要的最佳實踐,以確保用戶密碼的安全性。

那首先來解釋甚麼是JWT

當談到JWT(JSON Web Token)時,我們實際上在談論一種用於在不同實體之間傳遞信息的輕量級、自包含的安全令牌。JWT是一種特殊的數據結構,它以JSON格式表示,並被簽署以確保數據的完整性和可信度。以下是JWT的主要元素和其工作方式的詳細解釋:

  1. JSON 格式:JWT由三個部分組成,每個部分都使用Base64編碼,並由句點(.)分隔。這三個部分分別是標頭(Header)、聲明(Payload)和簽名(Signature)。
    • 標頭(Header):包含有關令牌的元數據,例如令牌的類型(JWT)和所使用的簽名算法(例如HMAC SHA256或RSA)。
    • 聲明(Payload):包含有關主題(通常是用戶)和其他數據的信息。聲明可以包括任何自定義數據,並且有一些預定義的聲明,例如到期時間(exp)和發行時間(iat)。
    • 簽名(Signature):使用標頭中指定的簽名算法對標頭和聲明進行簽名,以確保令牌的完整性。簽名是使用一個秘密的密鑰來生成的,只有具有該密鑰的實體才能驗證令牌。
  2. 自包含:JWT是自包含的,這意味著令牌本身包含了足夠的信息,以使其具有意義。這是與傳統的會話管理方式(如使用Cookie)不同的地方,後者需要在伺服器端保存狀態信息。
  3. 安全性:JWT通常用於身分驗證和授權,因此它們應該受到保護並妥善處理。由於JWT被簽署,並且可以選擇性地進行加密,因此只有擁有正確密鑰的實體才能解析和驗證JWT。
  4. 用途:JWT通常用於應用程式之間的安全通信,特別是當用戶需要通過一個身分驗證機制(例如使用帳戶和密碼)獲得訪問權限時。JWT還可以用於單點登入(SSO)場景,其中一個身分驗證可以在多個應用程式之間共享。

總之,JWT是一種用於跨不同實體之間傳遞和驗證信息的標準化方式,它具有自包含性、安全性和廣泛的用途,特別適用於分散式系統和身分驗證授權方面的應用。在實際應用中,你可以使用JWT來實現身分驗證、授權、單點登入等功能。


第28天挑戰完成~~


上一篇
Day27 使用Dapper實現ASP.NET Core Web API中的CRUD操作 (part 2 Controller 建立)
下一篇
Day29 建立安全的ASP.NET Core Web API註冊服務
系列文
30天開啟.NET後端工程師的旅程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言