密碼雜湊



如果您正在建立一個需要密碼進行使用者身份驗證的產品,則必須實施一個系統來驗證使用者的登入詳細資訊。但是,在資料庫中儲存未加密的密碼存在重大的安全風險。

因此,有一種方法可以保護使用者的密碼,那就是密碼雜湊。因此,在本章中,我們將定義密碼雜湊,討論其重要性,並展示雜湊技術如何幫助現代安全地設計我們的密碼。

密碼雜湊基礎

密碼雜湊使用加密方法將所有資料(例如您的密碼)壓縮成簡短的字元和/或數字字串。密碼雜湊有助於阻止攻擊者在網站遭到駭客攻擊時訪問您的登入資訊。相反,他們得到的只是您的密碼建立的難以理解的加密“雜湊”。

Hashing Passwords

md5() 雜湊函式被廣泛使用,它可以從任何輸入生成一個 32 個字元的字串。以下是一些雜湊示例:

  • "secret123": 5d7845ac6ee7cfffafc5fe5f35cf666d
  • "Helloworld": a165968b0a8084a041aed89bf40d581f
  • "mypassword": 34819d7beeabb9260a5c854bc85b3e44
  • "password123": 482c811da5d5b4bc6d497ffa98491e38
  • "hashingpasswords": 6b408e41b2f7a9944367d2b535a201f8

我們可以從這些例子中學到一些簡單的解釋:

  • 即使對輸入進行微小的更改,也會完全改變雜湊函式的結果。例如,更改單個字元可以完全改變輸出的外觀。
  • 無論輸入長度如何,雜湊函式始終產生相同長度的輸出。它始終是相同的大小——32 個字元。
  • 如果您使用相同的輸入和雜湊函式,您將始終獲得相同的結果。這很重要,因為它顯示了該過程的一致性和可靠性。
  • 僅知道雜湊函式使得僅從輸出確定原始輸入(例如密碼)非常困難。通常,嘗試透過檢視大量可能性來猜測原始輸入比直接嘗試找出它更快。

密碼雜湊的工作原理?

讓我們看看密碼雜湊的實際過程:

Hashing Passwords table
  • 使用者透過瀏覽網站並填寫表單來建立使用者名稱和密碼。
  • 將雜湊函式應用於密碼,並將結果儲存在資料庫中。
  • 使用者在登入後在網站上重新輸入其密碼。
  • 將之前使用的相同雜湊函式應用於輸入的密碼。
  • 伺服器將此雜湊與為使用者儲存在資料庫中的雜湊進行驗證。
  • 如果兩個雜湊完全匹配,則允許使用者訪問。
Hashing Passwords - Hashed Table

密碼雜湊的安全性

鑑於雜湊的長度與密碼無關,您可能會傾向於使用簡短且易於記憶的密碼。實際上,您應該做相反的事情。您選擇的密碼對於保護您的資料至關重要。

一旦網路犯罪分子從網站獲取密碼雜湊,實際的密碼破解過程就開始了。此操作是在網路犯罪分子的 PC 上離線進行的。網路犯罪分子使用雜湊函式來生成與您的雜湊匹配的雜湊。

由於這些函式是公開的,密碼駭客只需計算常用單詞和組合的雜湊值。然後,他們將破解的密碼與這些字典進行比較。

這些字典不僅包含單詞。其中還包括字首、字尾、用數字替換字母的約定(例如,使用 1 代替 l)以及許多其他內容。這意味著弱密碼很容易被破解。

確保強大的密碼安全性

為了確保強大的密碼安全性,您需要遵循以下一些重要提示:

  • 建立長密碼,幷包含大小寫字母、數字和特殊字元的組合。
  • 為每個帳戶使用不同的密碼。
  • 不要使用易於訪問的個人資訊,例如您的姓名、出生日期或常用詞。
  • 儘可能為您的帳戶啟用雙因素身份驗證。
  • 定期更改密碼,主要是針對電子郵件和銀行等敏感帳戶。
  • 避免將密碼儲存在易於訪問的地方,例如純文字檔案或便籤。
  • 確保您的裝置和軟體已更新為最新的安全補丁,以防止攻擊者利用已知的漏洞。

密碼儲存方法

有幾種方法可以安全地儲存密碼:

  • 雜湊 - 雜湊是指使用數學方法將密碼轉換為固定長度的字元字串。然後將雜湊後的密碼儲存在資料庫中。使用者登入時,使用者的密碼將再次雜湊,並與儲存的雜湊進行比較。常用的雜湊演算法包括 MD5、SHA-1 和 SHA-256。
  • 加鹽雜湊 − 對於每個密碼,在雜湊之前都會新增一個唯一的隨機值,稱為鹽。透過使用不同的鹽,可以確保兩個具有相同密碼的使用者具有不同的雜湊值。加鹽雜湊可以防止彩虹表攻擊,攻擊者在彩虹表攻擊中會預先計算常用密碼的雜湊值。
  • 金鑰派生函式 (KDF) − KDF 的目的是安全地從密碼中提取加密金鑰。為了減緩暴力破解攻擊,它們通常使用加鹽和迭代計數等特性。PBKDF2(基於密碼的金鑰派生函式 2)和 bcrypt 是 KDF 的兩個示例。
  • 金鑰伸展 − 這是重複迭代雜湊過程以減慢其速度的做法。由於每次嘗試都需要更多的處理能力,因此暴力破解攻擊的速度會因此變慢。金鑰伸展技術用於 bcrypt、scrypt 和 PBKDF2 等演算法。
  • 加椒 (Peppering) − 在雜湊密碼之前,新增一個秘密值(椒)。此方法稱為加椒。椒不會儲存在資料庫中,而是單獨儲存在雜湊密碼之外。因為攻擊者需要雜湊密碼和椒才能嘗試破解密碼,所以這增加了另一層安全保障。

密碼雜湊演算法

密碼通常使用多種技術進行安全雜湊。以下是一些最常用的演算法:

  • bcrypt
  • scrypt
  • Argon2
  • PBKDF2
  • SHA-256/SHA-3

密碼雜湊的實現

使用 Python

現在我們將實現用於雜湊密碼的 Python 程式碼,我們將使用 Python 的 hashlib 庫來生成雜湊物件。程式碼如下:

import hashlib

def hash_password(password):
   # change the password to bytes
   password_bytes = password.encode('utf-8')

   # generate a SHA-256 hash object
   hash_object = hashlib.sha256()

   # update the hash object with the password bytes
   hash_object.update(password_bytes)

   # the hexadecimal representation of the hashed password
   hashed_password = hash_object.hexdigest()

   return hashed_password

# function execution
password = "mysecure@password"
hashed_password = hash_password(password)
print("Hashed password:", hashed_password)

輸出

Hashed password: dc12e653439f07e6b0ee268b5559b45bb99be057dd7edd8756d77ef96b21aaee

使用 Java

在此實現中,我們將使用 Java 的 java.security.MessageDigest 和 java.security.NoSuchAlgorithmException 類。因此,MessageDigest 將用於生成訊息摘要例項,而 NoSuchAlgorithmException 類用於在找不到此類演算法時丟擲異常。程式碼如下:

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class HashingPassword  {
   public static String hashPassword(String password) throws NoSuchAlgorithmException {
      // Create a MessageDigest instance
      MessageDigest digest = MessageDigest.getInstance("SHA-256");

      // the bytes of the password
      byte[] passwordBytes = password.getBytes();

      // update the digest with the password bytes
      digest.update(passwordBytes);

      // get the hashed bytes
      byte[] hashedBytes = digest.digest();

      // change the hashed bytes to hexadecimal
      StringBuilder hexString = new StringBuilder();
      for (byte hashedByte : hashedBytes) {
         hexString.append(String.format("%02x", hashedByte));
      }

      return hexString.toString();
   }

   public static void main(String[] args) throws NoSuchAlgorithmException {
      String password = "mysecure@password";
      String hashedPassword = hashPassword(password);
      System.out.println("Hashed password: " + hashedPassword);
   }
}

輸出

Hashed password: dc12e653439f07e6b0ee268b5559b45bb99be057dd7edd8756d77ef96b21aaee
廣告
© . All rights reserved.