Bcrypt 雜湊模組



將一個字串轉換為另一個字串的過程稱為雜湊函式。雜湊函式有很多形式,但它們都有一個共同點,那就是它們是不可逆的。這意味著轉換應該是單向的,雜湊長度應該設定好,並且輸入字串應該完全匹配雜湊,以便以後可以進行比較。此屬性使其非常適合密碼和身份驗證。

在本章中,我們將學習如何使用 bcrypt 模組對密碼進行雜湊處理。密碼不應以明文形式儲存,因為它們容易受到多種攻擊。因此,有必要對其進行雜湊處理。

Hashing Technique

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 函式的結果是以下格式的字串

$2$[cost]$[22 字元鹽][31 字元雜湊]

例如,如果輸入密碼為“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 模組,用於建立安全的密碼雜湊。

廣告

© . All rights reserved.