- 密碼學教程
- 密碼學 - 首頁
- 密碼學 - 起源
- 密碼學 - 歷史
- 密碼學 - 原理
- 密碼學 - 應用
- 密碼學 - 優點與缺點
- 密碼學 - 現代
- 密碼學 - 傳統密碼
- 密碼學 - 加密的需求
- 密碼學 - 雙重強度加密
- 密碼系統
- 密碼系統
- 密碼系統 - 元件
- 密碼系統攻擊
- 密碼系統 - 彩虹表攻擊
- 密碼系統 - 字典攻擊
- 密碼系統 - 暴力破解攻擊
- 密碼系統 - 密碼分析技術
- 密碼學型別
- 密碼系統 - 型別
- 公鑰加密
- 現代對稱金鑰加密
- 密碼學雜湊函式
- 金鑰管理
- 密碼系統 - 金鑰生成
- 密碼系統 - 金鑰儲存
- 密碼系統 - 金鑰分發
- 密碼系統 - 金鑰撤銷
- 分組密碼
- 密碼系統 - 流密碼
- 密碼學 - 分組密碼
- 密碼學 - Feistel 分組密碼
- 分組密碼操作模式
- 分組密碼操作模式
- 電子密碼本 (ECB) 模式
- 密碼分組連結 (CBC) 模式
- 密碼反饋 (CFB) 模式
- 輸出反饋 (OFB) 模式
- 計數器 (CTR) 模式
- 經典密碼
- 密碼學 - 逆向密碼
- 密碼學 - 凱撒密碼
- 密碼學 - ROT13 演算法
- 密碼學 - 換位密碼
- 密碼學 - 加密換位密碼
- 密碼學 - 解密換位密碼
- 密碼學 - 乘法密碼
- 密碼學 - 仿射密碼
- 密碼學 - 簡單替換密碼
- 密碼學 - 簡單替換密碼加密
- 密碼學 - 簡單替換密碼解密
- 密碼學 - 維吉尼亞密碼
- 密碼學 - 實現維吉尼亞密碼
- 現代密碼
- Base64 編碼與解碼
- 密碼學 - XOR 加密
- 替換技術
- 密碼學 - 單字母替換密碼
- 密碼學 - 破解單字母替換密碼
- 密碼學 - 多字母替換密碼
- 密碼學 - Playfair 密碼
- 密碼學 - 希爾密碼
- 多字母替換密碼
- 密碼學 - 一次性密碼本密碼
- 一次性密碼本密碼的實現
- 密碼學 - 換位技術
- 密碼學 - 柵欄密碼
- 密碼學 - 列置換
- 密碼學 - 隱寫術
- 對稱演算法
- 密碼學 - 資料加密
- 密碼學 - 加密演算法
- 密碼學 - 資料加密標準
- 密碼學 - 三重 DES
- 密碼學 - 雙重 DES
- 高階加密標準
- 密碼學 - AES 結構
- 密碼學 - AES 變換函式
- 密碼學 - 位元組替換變換
- 密碼學 - 行移位變換
- 密碼學 - 列混合變換
- 密碼學 - 輪金鑰加變換
- 密碼學 - AES 金鑰擴充套件演算法
- 密碼學 - Blowfish 演算法
- 密碼學 - SHA 演算法
- 密碼學 - RC4 演算法
- 密碼學 - Camellia 加密演算法
- 密碼學 - ChaCha20 加密演算法
- 密碼學 - CAST5 加密演算法
- 密碼學 - SEED 加密演算法
- 密碼學 - SM4 加密演算法
- IDEA - 國際資料加密演算法
- 公鑰(非對稱)密碼學演算法
- 密碼學 - RSA 演算法
- 密碼學 - RSA 加密
- 密碼學 - RSA 解密
- 密碼學 - 建立 RSA 金鑰
- 密碼學 - 破解 RSA 密碼
- 密碼學 - ECDSA 演算法
- 密碼學 - DSA 演算法
- 密碼學 - Diffie-Hellman 演算法
- 密碼學中的資料完整性
- 密碼學中的資料完整性
- 訊息認證
- 密碼學數字簽名
- 公鑰基礎設施
- 雜湊
- 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 密碼
- 密碼學 - 對稱與非對稱
- 密碼學有用資源
- 密碼學 - 快速指南
- 密碼學 - 討論
Bcrypt 雜湊模組
將一個字串轉換為另一個字串的過程稱為雜湊函式。雜湊函式有很多形式,但它們都有一個共同點,那就是它們是不可逆的。這意味著轉換應該是單向的,雜湊長度應該設定好,並且輸入字串應該完全匹配雜湊,以便以後可以進行比較。此屬性使其非常適合密碼和身份驗證。
在本章中,我們將學習如何使用 bcrypt 模組對密碼進行雜湊處理。密碼不應以明文形式儲存,因為它們容易受到多種攻擊。因此,有必要對其進行雜湊處理。
Bcrypt 模組
Bcrypt 是一種安全地對密碼進行雜湊處理的方法。它由 Niels Provos 和 David Mazieres 於 1999 年建立。它基於 Blowfish 密碼。Bcrypt 向密碼新增“鹽”以保護它們免受攻擊。它也是自適應的,這意味著它可以隨著時間的推移而減慢速度以防止暴力破解攻擊,即使計算機速度加快也是如此。
它是 OpenBSD 的預設密碼雜湊,也是包括 SUSE Linux 在內的各種 Linux 發行版的預設密碼雜湊。
程式語言
Bcrypt 在多種程式語言中實現,包括 C、C++、C#、Delphi、Elixir、Go、Java、Python、JavaScript、Perl、PHP、Ruby 等。
函式描述
bcrypt 函式需要三個輸入:一個 16 位元組(128 位)的鹽值、一個數字成本和密碼字串(最多 72 位元組)。通常,鹽具有隨機值。Bcrypt 使用這些輸入生成一個 24 位元組(192 位)的雜湊值。bcrypt 函式的結果是以下格式的字串
例如,如果輸入密碼為“abc123xyz”,成本為 12,並且使用隨機鹽,則 bcrypt 的輸出將如下所示:
$2a$12$R9h/cIPz0gi.URNNX3kh2OPST9/PgBkqquzi.Ss7KIUgO2t0jWMUW
分析它 -
- $2a$ - 表示 bcrypt 是雜湊演算法。
- 12 - 表示輸入成本(2^12 輪,即 4096 次迭代)。
- R9h/cIPz0gi.URNNX3kh2O - 以 Base-64 編碼的輸入鹽。
- PST9/PgBkqquzi.Ss7KIUgO2t0jWMUW - 生成的 24 位元組雜湊的前 23 位元組的 Base-64 編碼。
注意 - RFC 4648 Base64 標準編碼與 bcrypt 中使用的 base-64 編碼不同。"./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789," 是使用的表。
使用 Python 的 Bcrypt
我們需要使用以下命令安裝 Bcrypt -
pip install bcrypt
使用的 Bcrypt 函式為 -
- bcrypt.gensalt() - 此函式用於生成鹽。一個稱為“鹽”的偽隨機字串附加到密碼。如果有人可以訪問資料庫,則雜湊可能會被破壞,因為它會為相同的輸入始終產生相同的結果。因此,在雜湊之前,鹽會附加到密碼的末尾。它返回一個偽隨機字串,並且不需要任何引數。
- bcrypt.hashpw() - 使用函式 bcrypt.hashpw() 建立最終儲存在資料庫中的雜湊值。
- 引數 - 我們可以以密碼和鹽的形式傳遞位元組碼。
- 返回值 - 如果雜湊過程成功,則返回一個雜湊字串。
對給定密碼進行雜湊處理
要在 Python 中使用 bcrypt 對密碼進行雜湊處理,首先匯入 bcrypt 模組。然後,使用 bcrypt.hashpw() 函式,該函式接受兩個引數:密碼字串(以位元組為單位)和鹽(雜湊函式中使用的隨機資料)。這是一個例子。
import bcrypt
# Password to hash
password = b"my_password"
# Generate a random salt
salt = bcrypt.gensalt()
# Hash the password with the salt
hashed_password = bcrypt.hashpw(password, salt)
# Print the hashed password
print("Hashed password:", hashed_password)
在此示例中,將“my_password”替換為您要雜湊的密碼。bcrypt.gensalt() 函式生成一個隨機鹽,然後 bcrypt.hashpw() 使用該鹽對密碼進行雜湊處理。
輸出
Hashed password: b'$2b$12$TFKa30kHN1JwE9DrAUlI9e2xeiNdXxFcWBfEeEysx5l2j1yhJ87Lu'
檢查密碼
使用 Python 中的 bcrypt 檢查使用者輸入的密碼是否與雜湊密碼匹配。因此,我們可以使用 bcrypt.checkpw() 函式。此函式接受兩個引數:使用者輸入的密碼和雜湊密碼。這是一個例子 -
import bcrypt
# Hashed password stored in the database
hashed_password = b'$2a$12$R9h/cIPz0gi.URNNX3kh2OPST9/PgBkqquzi.Ss7KIUgO2t0jWMUW'
# User-entered password
user_password = b"wrong_password"
# Check if the user-entered password matches the hashed password
if bcrypt.checkpw(user_password, hashed_password):
print("Password is correct!")
else:
print("Password is incorrect.")
如果使用者輸入的密碼與雜湊密碼匹配,則 bcrypt.checkpw() 函式將返回 True,否則返回 False。
Password is incorrect.
Bcrypt npm 包
JavaScript 中的 bcrypt npm 包用於安全地對密碼進行雜湊處理。與可以反轉以獲取原始密碼的加密不同,雜湊是不可逆的單向函式。
當用戶輸入密碼時,您的 JavaScript 應用程式對其進行雜湊處理並將雜湊值儲存到資料庫中。稍後,在身份驗證期間,您將輸入的密碼與儲存的雜湊值進行比較以檢視它們是否匹配。
bcrypt 庫透過提供安全的方法來對密碼進行雜湊處理和比較,從而簡化了此過程。
要使用該庫,您必須首先使用您的包管理器安裝它 -
npm install bcrypt # or yarn add bcrypt
然後,使用 require 將模組新增到您的 JavaScript 程式碼中 -
const bcrypt = require("bcrypt");
建立密碼
要使用 bycrypt 模組生成密碼,請呼叫 hash() 方法,該方法接受密碼字串、輪數和回撥函式。
const bcrypt = require('bcrypt');
// Hash a password
const password = 'itsmypassword';
bcrypt.hash(password, 10, function(err, hash) {
if (err) throw err;
// Store hash in your password DB.
console.log('Hashed password:', hash);
});
// Check if a password matches the hash
const inputPassword = 'itsmypassword';
const hashedPassword = '$2b$10$r1X5kL93Q8Vtqfbcxhkd8Od6iGgHsqQ6yMv48ZyB9N3hZLxrFhfmS';
bcrypt.compare(inputPassword, hashedPassword, function(err, result) {
if (err) throw err;
if (result) {
console.log('Password matches!');
} else {
console.log('Password does not match.');
}
});
將提供的程式碼儲存在一個檔案中,例如 bcrypt_example.js。使用 Node.js 執行指令碼 -
node bcrypt_example.js
Password does not match. Hashed password: $2b$10$IE83WAENrak/7n88FmKgD.Z2EFMy.uJRf8nqJG2h/FqMD7/6tb2n.
總結
密碼需要使用 bcrypt 進行雜湊以增強安全性。它可以防止密碼以明文形式儲存,並增強抵禦多種攻擊的保護能力。Python 和 Node.js 都包含 bcrypt 模組,用於建立安全的密碼雜湊。