簡體   English   中英

所有md5哈希都是一樣的嗎?

[英]Are all md5 hashes the same?

如果我使用bash腳本在一個cpmputer上為字符串創建md5哈希,那么如果我通過另一台計算機上的php腳本調用md5哈希,那么同一個字符串會創建相同的md5哈希嗎? 我正在嘗試在一台計算機上編寫腳本並將其移植到另一台計算機上。 該腳本將為用戶密碼創建md5哈希。 然后,單獨的網頁將要求輸入用戶名和密碼。 因為我不想存儲我希望存儲哈希的原始密碼,所以讓php腳本計算用戶輸入的密碼的哈希值,並在它們匹配時授予訪問權限。 這在理論上是否有效,或者是否存在我需要考慮的問題?

是的,MD5校驗和是平台無關的,每次在同一個文件/字符串/無論什么時都會產生相同的值。

但是,您可能想重新考慮您的計划。 至少鹽你的哈希。 StackOverflow上有很多關於用戶名/密碼存儲方案的建議。

是的,前提是您在每個平台上散列相同的字節序列 考慮一下,例如:

$ echo 'P4$$w0rd' | md5
9bb60af76b036e37a6d2626868c8c101
$ printf 'P4$$w0rd' | md5
640e5a3b9f9e4d667456c4e68194d6a2

為什么哈希不同? 因為echo在字符串的末尾添加換行符(ascii LF字符),而printf沒有。 您需要確保所有平台都以相同的方式編碼密碼(即ISO-8859-1與UTF-8對比UTF-16與帶有BOM的UTF-8 ...),如果有任何添加(如它應該是一致的(例如,Windows傾向於在行尾使用CRLF,而不僅僅是LF ......)。

另外,正如@Mitch Wheat所提到的,對於密碼存儲,你真的應該對哈希進行加密(即將一些隨機數據與密碼一起散列,然后存儲隨機數據哈希)。 比MD5更強大的東西也會很好,但這並不是那么重要。 這是一個完全快速和骯臟的實現:

# generate the hash:
read -s -p "Enter a password:" password
echo
salt="$RANDOM"  # Really should use something more random here...
hashedpw="$salt,$(printf "%s|%s" "$salt" "$password" | md5)"

echo "The salted hash is $hashedpw"

# check the hash:
read -s -p "Try to reenter the password:" testpassword
echo
salt="${hashedpw%%,*}"
hashonly="${hashedpw#*,}"
if [ "$hashonly" = "$(printf "%s|%s" "$salt" "$testpassword" | md5)" ]; then
    echo "That was the same password"
else
    echo "That was not the same password"
fi

編輯:這是生成隨機鹽的更好方法,雖然它可能不那么便攜:

salt="$(dd if=/dev/random bs=16 count=1 2>/dev/null | od -x | sed 's/^[0-9]*//' | tr -d $' \t\n')"

如果你想要更多隨機性,只需增加bs=16參數; 它控制使用的隨機數據的字節數。

是的,理論上應該有效。 MD5是一種散列算法,因此只要它使用MD5作為兩端,它應該沒有問題。

您可能還需要考慮其他更安全的哈希算法,例如SHA。 而且,正如上面的評論所暗示的那樣,你應該總是為你的哈希加鹽以增加額外的安全層......

暫無
暫無

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

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