Passwords
從 SHA-512 雜湊值中解密密碼
我目前正在研究 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:使雜湊計算唯一的唯一值,因此希望破解密碼的對手無法進行對一次破解多個密碼有用的計算。
- 緩慢:因此,即使對於實用的低熵密碼,知道散列的對手的蠻力嘗試(猜測,計算其散列,將其與已知散列進行比較)也會花費不切實際的長時間。
請參閱如何安全地散列密碼?以獲得更詳細的解釋。
您的密碼雜湊方案具有三種成分中的兩種:雜湊和鹽。請記住,鹽必須與雜湊值一起保存,以便在客戶端送出候選密碼時可以進行相同的雜湊計算。你錯過了緩慢,這可以通過對雜湊函式進行多次迭代來實現。有更好的方法來實現緩慢,這也使得設計專用於快速密碼計算的專用硬體變得更加困難;再次,請參閱如何安全地散列密碼?更多細節。