- 密碼學教程
- 密碼學 - 首頁
- 密碼學 - 起源
- 密碼學 - 歷史
- 密碼學 - 原理
- 密碼學 - 應用
- 密碼學 - 優缺點
- 密碼學 - 現代
- 密碼學 - 傳統密碼
- 密碼學 - 加密的需求
- 密碼學 - 雙重強度加密
- 密碼系統
- 密碼系統
- 密碼系統 - 組成部分
- 密碼系統攻擊
- 密碼系統 - 彩虹表攻擊
- 密碼系統 - 字典攻擊
- 密碼系統 - 暴力攻擊
- 密碼系統 - 密碼分析技術
- 密碼學型別
- 密碼系統 - 型別
- 公鑰加密
- 現代對稱金鑰加密
- 密碼學雜湊函式
- 金鑰管理
- 密碼系統 - 金鑰生成
- 密碼系統 - 金鑰儲存
- 密碼系統 - 金鑰分發
- 密碼系統 - 金鑰撤銷
- 分組密碼
- 密碼系統 - 流密碼
- 密碼學 - 分組密碼
- 密碼學 - Feistel 分組密碼
- 分組密碼的工作模式
- 分組密碼的工作模式
- 電子密碼本 (ECB) 模式
- 密碼分組連結 (CBC) 模式
- 密碼反饋 (CFB) 模式
- 輸出反饋 (OFB) 模式
- 計數器 (CTR) 模式
- 經典密碼
- 密碼學 - 反向密碼
- 密碼學 - 凱撒密碼
- 密碼學 - ROT13 演算法
- 密碼學 - 置換密碼
- 密碼學 - 加密置換密碼
- 密碼學 - 解密置換密碼
- 密碼學 - 乘法密碼
- 密碼學 - 仿射密碼
- 密碼學 - 簡單替換密碼
- 密碼學 - 簡單替換密碼加密
- 密碼學 - 簡單替換密碼解密
- 密碼學 - 維吉尼亞密碼
- 密碼學 - 維吉尼亞密碼的實現
- 現代密碼
- Base64 編碼和解碼
- 密碼學 - XOR 加密
- 替換技術
- 密碼學 - 單字母替換密碼
- 密碼學 - 單字母替換密碼的破解
- 密碼學 - 多字母替換密碼
- 密碼學 - Playfair 密碼
- 密碼學 - Hill 密碼
- 多字母替換密碼
- 密碼學 - 一次性密碼本密碼
- 一次性密碼本密碼的實現
- 密碼學 - 置換技術
- 密碼學 - 柵欄密碼
- 密碼學 - 列置換密碼
- 密碼學 - 密碼隱寫術
- 對稱演算法
- 密碼學 - 資料加密
- 密碼學 - 加密演算法
- 密碼學 - 資料加密標準 (DES)
- 密碼學 - 三重 DES
- 密碼學 - 雙重 DES
- 高階加密標準 (AES)
- 密碼學 - AES 結構
- 密碼學 - AES 變換函式
- 密碼學 - 位元組替換變換
- 密碼學 - 行移位變換
- 密碼學 - 列混淆變換
- 密碼學 - 輪金鑰加變換
- 密碼學 - AES 金鑰擴充套件演算法
- 密碼學 - Blowfish 演算法
- 密碼學 - SHA 演算法
- 密碼學 - RC4 演算法
- 密碼學 - Camellia 加密演算法
- 密碼學 - ChaCha20 加密演算法
- 密碼學 - CAST5 加密演算法
- 密碼學 - SEED 加密演算法
- 密碼學 - SM4 加密演算法
- IDEA - 國際資料加密演算法
- 公鑰(非對稱)密碼演算法
- 密碼學 - RSA 演算法
- 密碼學 - RSA 加密
- 密碼學 - RSA 解密
- 密碼學 - 建立 RSA 金鑰
- 密碼學 - 破解 RSA 密碼
- 密碼學 - ECDSA 演算法
- 密碼學 - DSA 演算法
- 密碼學 - Diffie-Hellman 演算法
- 密碼學中的資料完整性
- 密碼學中的資料完整性
- 訊息認證
- 密碼學數字簽名
- 公鑰基礎設施 (PKI)
- 雜湊
- MD5(訊息摘要演算法 5)
- SHA-1(安全雜湊演算法 1)
- SHA-256(安全雜湊演算法 256 位)
- SHA-512(安全雜湊演算法 512 位)
- SHA-3(安全雜湊演算法 3)
- 密碼雜湊
- Bcrypt 雜湊模組
- 現代密碼學
- 量子密碼學
- 後量子密碼學
- 密碼協議
- 密碼學 - SSL/TLS 協議
- 密碼學 - SSH 協議
- 密碼學 - IPsec 協議
- 密碼學 - PGP 協議
- 影像和檔案加密
- 密碼學 - 影像
- 密碼學 - 檔案
- 密碼隱寫術 - 影像
- 檔案加密和解密
- 密碼學 - 檔案加密
- 密碼學 - 檔案解密
- 物聯網中的密碼學
- 物聯網安全挑戰、威脅和攻擊
- 物聯網安全的密碼技術
- 物聯網裝置的通訊協議
- 常用的密碼技術
- 自定義構建密碼演算法(混合密碼)
- 雲密碼學
- 量子密碼學
- 密碼學中的影像隱寫術
- DNA 密碼學
- 密碼學中的一次性密碼 (OTP) 演算法
- 區別
- 密碼學 - MD5 與 SHA1 的比較
- 密碼學 - RSA 與 DSA 的比較
- 密碼學 - RSA 與 Diffie-Hellman 的比較
- 密碼學與密碼學的比較
- 密碼學 - 密碼學與密碼分析的比較
- 密碼學 - 經典與量子的比較
- 密碼學與隱寫術的比較
- 密碼學與加密的比較
- 密碼學與網路安全的比較
- 密碼學 - 流密碼與分組密碼的比較
- 密碼學 - AES 與 DES 密碼的比較
- 密碼學 - 對稱與非對稱的比較
- 密碼學有用資源
- 密碼學 - 快速指南
- 密碼學 - 討論
密碼雜湊
如果您正在建立一個需要密碼進行使用者身份驗證的產品,則必須實施一個系統來驗證使用者的登入詳細資訊。但是,在資料庫中儲存未加密的密碼存在重大的安全風險。
因此,有一種方法可以保護使用者的密碼,那就是密碼雜湊。因此,在本章中,我們將定義密碼雜湊,討論其重要性,並展示雜湊技術如何幫助現代安全地設計我們的密碼。
密碼雜湊基礎
密碼雜湊使用加密方法將所有資料(例如您的密碼)壓縮成簡短的字元和/或數字字串。密碼雜湊有助於阻止攻擊者在網站遭到駭客攻擊時訪問您的登入資訊。相反,他們得到的只是您的密碼建立的難以理解的加密“雜湊”。
md5() 雜湊函式被廣泛使用,它可以從任何輸入生成一個 32 個字元的字串。以下是一些雜湊示例:
- "secret123": 5d7845ac6ee7cfffafc5fe5f35cf666d
- "Helloworld": a165968b0a8084a041aed89bf40d581f
- "mypassword": 34819d7beeabb9260a5c854bc85b3e44
- "password123": 482c811da5d5b4bc6d497ffa98491e38
- "hashingpasswords": 6b408e41b2f7a9944367d2b535a201f8
我們可以從這些例子中學到一些簡單的解釋:
- 即使對輸入進行微小的更改,也會完全改變雜湊函式的結果。例如,更改單個字元可以完全改變輸出的外觀。
- 無論輸入長度如何,雜湊函式始終產生相同長度的輸出。它始終是相同的大小——32 個字元。
- 如果您使用相同的輸入和雜湊函式,您將始終獲得相同的結果。這很重要,因為它顯示了該過程的一致性和可靠性。
- 僅知道雜湊函式使得僅從輸出確定原始輸入(例如密碼)非常困難。通常,嘗試透過檢視大量可能性來猜測原始輸入比直接嘗試找出它更快。
密碼雜湊的工作原理?
讓我們看看密碼雜湊的實際過程:
- 使用者透過瀏覽網站並填寫表單來建立使用者名稱和密碼。
- 將雜湊函式應用於密碼,並將結果儲存在資料庫中。
- 使用者在登入後在網站上重新輸入其密碼。
- 將之前使用的相同雜湊函式應用於輸入的密碼。
- 伺服器將此雜湊與為使用者儲存在資料庫中的雜湊進行驗證。
- 如果兩個雜湊完全匹配,則允許使用者訪問。
密碼雜湊的安全性
鑑於雜湊的長度與密碼無關,您可能會傾向於使用簡短且易於記憶的密碼。實際上,您應該做相反的事情。您選擇的密碼對於保護您的資料至關重要。
一旦網路犯罪分子從網站獲取密碼雜湊,實際的密碼破解過程就開始了。此操作是在網路犯罪分子的 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