我正在學習Python。我無法弄清楚爲什麼hashlib.sha512(salt + password).hexdigest()
沒有給出預期的結果。hashlib vs crypt.crypt()在Python中。爲什麼不同的結果
我正在尋找相當於Ulrich Drepper的sha512crypt.c algorithm的純Python實現。 (我花了一段時間才弄清楚我在找什麼。)
根據Ubuntu 12.04系統上crypt
的手冊頁,crypt使用SHA-512(因爲字符串以$ 6 $開頭)。
下面的代碼驗證當我調用Python的系統crypt(即crypt.crypt())的包裝時,行爲與預期的一樣。我想使用hashlib.sha512或其他一些Python庫來產生與crypt.crypt()相同的結果。怎麼樣?
這段代碼演示了我遇到的問題:
import hashlib, crypt
ctype = "6" #for sha512 (see man crypt)
salt = "qwerty"
insalt = '${}${}$'.format(ctype, salt)
password = "AMOROSO8282"
value1 = hashlib.sha512(salt + password).hexdigest() #what's wrong with this one?
value2 = crypt.crypt(password, insalt) #this one is correct on Ubuntu 12.04
if not value1 == value2:
print("{}\n{}\n\n".format(value1, value2))
根據隱窩手冊頁,SHA-512是86個字符。上面的代碼中的crypt()
調用符合此。然而,hashlib.sha512的輸出超過86個字符長,所以事情是這兩個implmentations之間的路要走......
下面是對於那些不想運行的代碼誰輸出:
051f606027bd42c1aae0d71d049fdaedbcfd28bad056597b3f908d22f91cbe7b29fd0cdda4b26956397b044ed75d50c11d0c3331d3cb157eecd9481c4480e455
$6$qwerty$wZZxE91RvJb4ETR0svmCb69rVCevicDV1Fw.Y9Qyg9idcZUioEoYmOzAv23wyEiNoyMLuBLGXPSQbd5ETanmq/
這裏基於初始反饋的另一個嘗試。沒有成功尚未:
import hashlib, crypt, base64
ctype = "6" #for sha512 (see man crypt)
salt = "qwerty"
insalt = '${}${}$'.format(ctype, salt)
password = "AMOROSO8282"
value1 = base64.b64encode(hashlib.sha512(salt + password).digest())
value2 = crypt.crypt(password, insalt) #this one is correct
if not value1 == value2:
print("{}\n{}\n\n".format(value1, value2))
是您的密碼(不包括數字)故意用葡萄牙語表示的還是一個尷尬的巧合?只是好奇':)' – JMCF125
這個密碼是一個真正的密碼,從真正的被盜密碼fwiw的大型數據庫中提取。 – MountainX
我明白了。如果沒有鹽,用葡萄牙語小字典制作的彩虹桌確實很容易破解。順便說一句,+1,這是一個有趣的問題,即使我不使用Python。 – JMCF125