PHP中md5()、crc32()和sha1()加密方式有什么区别?

7

它们生成的编码长度不同。

crc32() 生成32位代码

sha1() 生成128位代码

md5() 生成160位代码

这是正确的吗?还是它们之间有更多的区别?


2
你应该说明你想用这些哈希函数做什么,因为哈希函数有不同的用途。如果你打算存储密码,请记住这些函数都不合适,而是使用一个慢速的密钥派生函数,比如BCrypt。 - martinstoeckli
@martinstoeckli 哦,是的,我忘记了bcrypt :D 不过它有php实现吗? - Patashu
1
@Patashu - 是的,有一个方法,但使用起来有点棘手,请看这个例子 - martinstoeckli
6个回答

18
他们各自实现了不同的加密哈希函数,每个哈希函数都会生成不同大小的哈希值。你展示的这三个函数的主要区别是 sha1md5 实际上是被设计成安全的加密哈希函数。crc32 (crc 代表 循环冗余校验) 函数并不是加密函数,它被设计用来生成用于检查文件完整性的哈希值(主要用于确定文件是否在下载过程中损坏)。

顺便提一句:请不要在任何真正的加密工作中(例如哈希密码)使用md5sha1。它们都存在严重缺陷(只需问问evernote或其他因使用这种旧算法而被烧毁的公司)。相反,请使用php crypt()函数并使用SHA-256或SHA-512(比256更好),或者blowfish。并且始终对您的哈希进行盐处理...


3
实际上,即使是SHA-512也不适合用来哈希密码,你应该使用慢速密钥派生函数,例如BCryptPBKDF2。它们具有可调节的成本因素,可以随着未来硬件的增长而增加。 - martinstoeckli

4
我认为不仅是长度不同,它们还使用不同的算法来加密数据。
PHP中的加密使用简单,但这并不意味着它是免费的。首先,根据您要加密的数据,您可能有理由将32位值存储在数据库中,而不是160位值以节省空间。其次,加密越安全,生成哈希值所需的计算时间就越长。如果需要频繁生成md5(),高流量网站可能会显著减慢。

好的。哪一个更安全,md5() 因为它的长度是160位? - user1905850
2
MD5不是最安全的——SHA1比MD5更现代,而且已经发现MD5是可破解的,例如可以找到另一条消息与给定的MD5哈希值相同。 - Patashu
@Patashu 是的,MD5是可以被破解的,而且已经被破解了...Bcrypt目前还没有被破解 - Dipesh Parmar
@Dipesh Parmar 是的,bcrypt和相关哈希是密码的最佳选择。如果您无法访问它,则应使用sha256,然后是sha1以及密码上的盐。 - Patashu
@Patashu,甚至AES也可以。 - Dipesh Parmar
@Dipesh Parmar AES不是为哈希而设计的 - 使用正确的工具来完成工作。 - Patashu

3

crc32不是哈希算法

crc32 会生成“str的crc32校验和整数”。它的预期用途是快速验证某些内容的完整性,广泛用于检测意外更改,例如网络传输错误。

md5和sha1是哈希算法

最好阅读php文档,其中包含示例:

为什么常见的哈希函数如md5()和sha1()不适合用于密码? MD5、SHA1和SHA256等哈希算法旨在非常快速和高效。通过现代技术和计算机设备,已经变得轻而易举地“暴力破解”这些算法的输出,以确定原始输入。

一个 md5 是128位的,而一个 sha1 是160位的。问题中这个相反了。 md5sha1 的一个主要区别是还没有发现 sha1碰撞的例子。也就是说,如果您使用 md5 用于两个不同的输入,可能会得到相同的哈希值;而使用 sha1 则不可能。除此之外,它们实现了不同的算法,但是,例如,它们都不适合存储密码,尽管通常用于这样做。

1
CRC在检查篡改方面几乎没有用处。它的预期目的是检测无意错误,如网络传输错误。密码哈希函数更适合用于有意的篡改防御。 - Egon Olieux
@EgonOlieux 我更新了答案,因为它有点含糊。谢谢! - AD7six

1
crc32()并非用于加密目的。它的作用是快速生成哈希值,因此当您需要快速生成有用的哈希值时,应使用它。出于这个原因,网络设备中会使用它。
md5()和sha1()都是加密哈希算法,意味着它们旨在具有非常好的特性,例如很难仅通过哈希值找到产生该哈希值的消息。然而,sha1比md5更安全、更现代。实际上,如果您关心安全性,应考虑废弃使用md5。
还要记得通过连接一些额外内容来为密码哈希添加“盐”,或者使用称为“彩虹表”的大型预先哈希通用密码列表来破解用户帐户所对应的哈希值。

0

这些被称为哈希函数。

http://en.wikipedia.org/wiki/Hash_function - 解释了不同类型的哈希函数

它们在内部完全不同。

注意:不要将crc32用于加密目的。它的使用是为了快速哈希,与sha1md5相比,它不太安全。


2
如果安全是一个问题,它们不会“做同样的事情”。crc32不提供任何加密保证,例如,用于散列密码真的很不安全。 - Patashu

-4

主要的区别在于生成的哈希长度不同。

CRC32 is, evidently, 32 bits, 
sha1() returns a 128 bit value, 
and md5() returns a 160 bit value. 

在避免碰撞时非常重要。


2
这比那复杂得多了... - Patashu
你混淆了SHA1和MD5返回值的长度。 - xmoex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接