所有md5哈希都是一样的吗?

时间:2012-01-25 01:31:36

标签: php security bash md5

如果我使用bash脚本在一个cpmputer上为字符串创建一个md5哈希,那么如果我通过另一台计算机上的php脚本调用md5哈希,那么同一个字符串会创建相同的md5哈希吗?我正在尝试在一台计算机上编写脚本并将其移植到另一台计算机上。该脚本将为用户密码创建md5哈希。然后,单独的网页将要求输入用户名和密码。因为我不想存储我希望存储哈希的原始密码,所以让php脚本计算用户输入的密码的哈希值,并在它们匹配时授予访问权限。这在理论上是否有效,或者我需要考虑哪些问题?

3 个答案:

答案 0 :(得分:7)

是的,MD5校验和是平台无关的,每次都会在同一个文件/字符串/上生成相同的值。

但是,您可能想重新考虑您的计划。至少盐你的哈希。 StackOverflow上有很多关于用户名/密码存储方案的建议。

答案 1 :(得分:6)

是的,前提是您在每个平台上散列相同的字节序列。考虑一下,例如:

$ 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参数;它控制使用的随机数据的字节数。

答案 2 :(得分:2)

是的,理论上应该有效。 MD5是一种散列算法,因此只要它使用MD5作为两端,它应该没有问题。

您可能需要考虑其他更安全的哈希算法,例如SHA。而且,正如上面的评论所暗示的那样,你应该总是为你的哈希加盐以增加额外的安全层......