Php 好的加密散列函数

Php 好的加密散列函数,php,hash,passwords,crypt,Php,Hash,Passwords,Crypt,可能重复: 我正在制作一个网站,我需要一个安全的算法来存储密码。 我首先想到的是bcrypt,但后来我发现我的主机不支持它,我无法更改主机 我的主机允许此加密: 标准DES 这些散列: MD5 md2、md4和md5 sha1、SH256、SH384和SH512 ripemd128、ripemd160、ripemd256和ripemd360 漩涡 老虎128,3,老虎160,3,老虎192,3,老虎128,4,老虎160,4和老虎192,4 斯奈弗鲁 戈斯特 阿德勒32 crc32和cr

可能重复:

我正在制作一个网站,我需要一个安全的算法来存储密码。 我首先想到的是bcrypt,但后来我发现我的主机不支持它,我无法更改主机

我的主机允许此加密:

  • 标准DES
这些散列:

  • MD5
  • md2、md4和md5
  • sha1、SH256、SH384和SH512
  • ripemd128、ripemd160、ripemd256和ripemd360
  • 漩涡
  • 老虎128,3,老虎160,3,老虎192,3,老虎128,4,老虎160,4和老虎192,4
  • 斯奈弗鲁
  • 戈斯特
  • 阿德勒32
  • crc32和crc32b
  • 哈瓦那128,3,哈瓦那160,3,哈瓦那192,3,哈瓦那224,3,哈瓦那256,3,哈瓦那128,4,哈瓦那192,4,哈瓦那224,3,哈瓦那256,4,哈瓦那128,5,哈瓦那160,5,哈瓦那192,5,哈瓦那224,5&哈瓦那256,5

所以,你们中有谁能用它和salt来修正一个好的算法吗?

你们根本不应该存储加密(甚至是未加密)的密码。相反,最好使用SHA2-512(拉伸,例如使用)

以下是所列哈希的分类(有关详细信息,请参阅):

加密(不是散列函数):DES
非加密校验和(可笑):adler32、crc32、crc32b
断裂:MD2、MD4、MD5、SHA1
可能已破碎:老虎、斯奈夫鲁、戈斯特、哈弗*
可能安全:SHA2-256/384/512、RIPEMD-128/256、RIPEMD-160/320、惠而浦


请注意,强度指的是找到与已知哈希匹配的任何密码的攻击(预映像攻击)。此外,上述排序是偏执的,会立即丢弃任何已知漏洞的散列。

crc32、adler32等都不是为了加密安全而设计的——它们只是快速校验和算法。我认为咸SHA-256应该提供安全性和兼容性的良好结合

有一次,我记得在一台速度较慢的服务器上使用salted MD5时,预期会有中等负载。所以我决定用一个32位的随机盐填充它,并将整个内容存储为十六进制——它给人的印象是整个内容都是未加盐的SHA-1。我真诚地希望有人浪费宝贵的时间在偷来的垃圾堆上跑彩虹桌

安全性并不仅仅是更昂贵的散列:)

你应该

  • 用盐作为你的杂烩的一部分
  • 使用10000+迭代范围内的迭代例程。例如,PBKDF#2
  • 使用已知的强散列(SHA-256、SHA-512)

正如gnur所说,您需要决定是散列还是加密密码。如果这些是您自己用户的密码,并且这些密码仅在您的系统上使用,则使用salt和stretching将其散列。在可用的散列算法中,使用SHA-256或SHA-512。对于salt,使用128个随机位(16字节)。理想情况下使用加密RNG,尽管非加密RNG在必要时也可以。攻击者被认为无论如何都知道这些盐。扩展到处理单个密码大约需要0.1秒。这将任何攻击者每秒尝试破解密码的次数限制为10次


如果要存储登录到外部系统的密码,则需要加密密码,并在需要时解密密码。DES是您在这里唯一的实际选择,除非您也有3DE(也称为三重DES或DESede)可用。我很惊讶AES/Rijndael不可用。如果是us,则优先于DES。

您应将密码存储为上述哈希,而不是加密密码

哈希函数基本上是一种单向转换,它总是为相同的输入参数生成相同的哈希。不可能将哈希转换回其原始形式,否则将认为哈希函数已损坏

加密是一种双向转换,如果您有密钥,可以将加密数据转换回原始形式

通过将密码存储为散列,并且由于密码是单向转换的,因此即使有人获得数据库,也无法提取密码


检查密码时,只需使用存储密码中使用的哈希函数对其进行转换,然后对照数据库进行检查。

您想要什么?加密还是散列?此外,md5是一个散列,而不是加密。请注意,它一定有很好的信息读取。使用sha256或sha512,迭代,然后使用它…我不确定加密和哈希之间的区别,但是你描述的方式我想是散列。@Snacker:我上面链接的答案非常详细地描述了两者的区别……这个问题同时提到了散列和salt……有时为了能够登录到外部系统,需要存储加密的密码。@Wooble这个问题是关于如何存储密码的。加密不是答案,如我之前的评论所述。@hanshenrik包括复杂度为2^47的16轮精简老虎的完全冲突,以及复杂度为2^47的24轮老虎的伪冲突。这并不意味着Tiger在SHA-1级别(基本上每个人都可以进行预映像攻击)被打破,但我对这些安全裕度感到不舒服。我很有可能误解了什么。非常接近,但不是完全接近,再近一点看,这是23轮的伪碰撞,不是24轮。。但在这个时代,让人不舒服的不雅行为从来都不是一种选择。在PHP领域使用DES比使用DES更好,DES是非常容易被破坏的…通过模糊性实现的安全性(padding方法实际上就是这样)不是安全性。这可能会让你在晚上感觉更好,但最终并不会让它变得更安全。当你把它和什么时候被破坏的概念结合在一起时(这将是,它只需要时间),由于ea,每个人的密码都会更容易被暴力破解