簡體   English   中英

為什么bcrypt.hashpw可用於散列和驗證密碼?

[英]Why can bcrypt.hashpw be used both for hashing and verifying passwords?

使用bcrypt和Python 2.7,我可以看到該示例使用bcrypt.hashpw來哈希密碼進行存儲並驗證給定的密碼是否與哈希密碼相匹配,如下所示:

哈希

import bcrypt
password = b"somepassword"
hashed = bcrypt.hashpw(password, bcrypt.gensalt())

好的,到目前為止一切順利。 現在使用bcrypt對給定的密碼進行哈希處理,因此它是一個哈希字節的字符串。


驗證

現在,這是令我困惑的部分:要檢查明文密碼是否與哈希密碼匹配,使用相同的函數,使用哈希密碼作為salt:

if bcrypt.hashpw(password, hashed) == hashed:
    print("It Matches!")
else:
    print("It Does not Match :(")


發生了什么?

兩個bcrypt.hashpw調用的結果不應該不同,因為輸入鹽是不同的?

我能想到的唯一合理的答案是,在將前綴添加到哈希密碼之前,鹽被截斷為固定長度。 這樣,當使用散列的結果時,僅留下生成的鹽(在剝離尾隨的散列密碼之后),並且使用截斷的鹽散列密碼的結果與原始密碼相同。 但是,我沒有任何證據支持這一點。

為什么這樣做?

在表達式bcrypt.hashpw(password, hashed)僅第一耦合的字符的hashed被用於鹽,而不是整個字符串。

例如,在此示例中, hashpw()的輸出如何以hashpw()開頭:

salt1 = b"$2a$12$w40nlebw3XyoZ5Cqke14M."

print "salt1:", salt1
print "hash1:", bcrypt.hashpw(password, salt1)

打印:

salt1: $2a$12$w40nlebw3XyoZ5Cqke14M.
hash1: $2a$12$w40nlebw3XyoZ5Cqke14M.d.7cdO2wJhr/K6ZSDjODIxLrPmYzY/a

所以有一個慣例,鹽只上升第一個時期或前29個字符。

hashpw函數返回salted哈希(迭代多次,遵循bcyrpt規范), bcyrpt是使用的鹽(並且以點作為分隔符)。

In : salt = bcrypt.gensalt()
In : all(salt == bcrypt.hashpw(pw,salt)[:len(salt)] for pw in ('','12345','asdfgh'))
Out: True

如果bcrypt.hashpw的第二個參數被識別為VALID_SALT.VALID_HASH ,則salt會自動設置為VALID_SALT ,從而在相同的pw輸入上生成與原始密碼相同的salt-hash-pair。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM