Passwords

從 SHA-512 雜湊值中解密密碼

  • October 9, 2013

我目前正在研究 AES 算法並使用 Python 編寫程式碼。我正在嘗試將“鹽”添加到使用者輸入密碼中,

這就是我正在做的,

import hashlib
import os
password = "Sufiyan Ghori" 
salt = os.urandom(32) # 32bytes * 8 = 256bits
# Adding the Password into the first 128bits of SALT
# So that the password could be encrypted
Encoded_Password = password.encode('utf-8') + salt[:16]
# Output will be, Password + Salt

我在上面添加了評論以便更好地理解。

如果 32 字節鹽等於

b'\x937{\xa0\x9bo\x9f\x8b1\xbf\xa9\xc9\x01\x86\xa1\xd9\xc7\x00+\x81\t\x0f\\\xdc\
x9a\xe5\x84r\xce$EJ'

那麼Password + Salt[:16]將是

b'Sufiyan Ghori\x937{\xa0\x9bo\x9f\x8b1\xbf\xa9\xc9\x01\x86\xa1\xd9'

如果我然後使用 sha512 創建它的摘要,

sha512 = hashlib.sha512( Encoded_Password ).digest()

輸出將是

b"\xe8\x02\xcc\xa9\x1a\xd3\x1b\x80\x1f{\xd2\xa6E7\x9d\x87\xcf\x17\xb1\xb4\x07\xb
1\xfe\xf2\x9a\xa5\xcc\xe7\x92\xc0\x81\xed\xf8HPu\xe2'\xfc\x0b\xc1\xa6\xc8\xd0N5a
\xc1;\xf7\xbc\xe3\xafN\xcaN\xdfqhc&A#%"

我現在應該如何Sufiyan Ghori從這個固定長度的雜湊值中恢復原始密碼?

您無法從雜湊中恢復密碼。這不是密碼雜湊的設計目的——恰恰相反:使用正確的密碼雜湊,在給定雜湊的情況下恢復密碼的唯一方法是猜測並驗證它——雜湊方案越好,驗證成本越高猜測是。

密碼用於身份驗證:客戶端試圖通過證明它知道密碼來向驗證者證明其真實性。客戶端知道密碼,不需要重新計算。驗證者知道密碼的雜湊值;客戶端告訴驗證者它聲稱密碼是什麼,驗證者計算候選密碼的雜湊並將其與參考雜湊進行比較。驗證者不需要計算密碼。這是有效的,因為計算密碼的雜湊是確定性的(計算總是給出相同的結果)。

密碼雜湊需要三個要素:

  • 散列:一個單向函式(或一個足夠好的近似值——一個沒有人知道如何計算逆的函式),因此除非幸運的猜測,否則無法從散列中恢復密碼。
  • Salt:使雜湊計算唯一的唯一值,因此希望破解密碼的對手無法進行對一次破解多個密碼有用的計算。
  • 緩慢:因此,即使對於實用的低熵密碼,知道散列的對手的蠻力嘗試(猜測,計算其散列,將其與已知散列進行比較)也會花費不切實際的長時間。

請參閱如何安全地散列密碼?以獲得更詳細的解釋。

您的密碼雜湊方案具有三種成分中的兩種:雜湊和鹽。請記住,鹽必須與雜湊值一起保存,以便在客戶端送出候選密碼時可以進行相同的雜湊計算。你錯過了緩慢,這可以通過對雜湊函式進行多次迭代來實現。有更好的方法來實現緩慢,這也使得設計專用於快速密碼計算的專用硬體變得更加困難;再次,請參閱如何安全地散列密碼?更多細節。

引用自:https://crypto.stackexchange.com/questions/10908