良好的加密哈希函数 [重复]

Posted

技术标签:

【中文标题】良好的加密哈希函数 [重复]【英文标题】:Good cryptographic hash functions [duplicate] 【发布时间】:2011-10-27 10:31:44 【问题描述】:

可能重复:Secure hash and salt for php passwords

我正在制作一个网站,我需要一个安全的算法来存储密码。 一开始想bcrypt,后来发现我的host不支持,也没法换host。

我的主机允许这种加密:

标准 DES

还有这些哈希:

MD5 md2、md4 和 md5 sha1、sha256、sha384 和 sha512 ripemd128、ripemd160、ripemd256 和ripemd360 漩涡浴 tiger128,3,tiger160,3,tiger192,3,tiger128,4,tiger160,4 &tiger192,4 snefru 哥特 adler32 crc32 & crc32b haval128,3, haval160,3, haval192,3, haval224,3, haval256,3, haval128,4, haval160,4, haval192,4, haval224,3, haval256,4, haval128,5, haval160,5 , haval192,5, haval224,5 & haval256,5

那么,你们中的任何人都可以用它和盐来修复一个好的算法吗?

【问题讨论】:

你想要什么?加密还是散列?另外,md5 是哈希,不是加密。 看看***.com/search?q=php+store+passwords,一定有好资料 阅读this answer。使用 sha256 或 sha512,迭代,完成...... 我不确定加密和散列之间的区别,但你描述的方式我猜是散列。 @Snacker:我上面链接的答案非常详细地描述了差异...... 【参考方案1】:

您根本不应该存储加密(甚至未加密)的密码。而是使用salted hashes(拉伸,例如使用PBKDF2),最好使用SHA2-512。

作为参考,这里是列出的哈希的分类(详见wikipedia):

加密(不是散列函数):DES非加密校验和(可笑):adler32、crc32、crc32b损坏:MD2、MD4、MD5、SHA1可能损坏:Tiger、snefru、GOST、HAVAL*可能安全:SHA2-256/384 /512、RIPEMD-128/256、RIPEMD-160/320、惠而浦

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

【讨论】:

问题提到了散列和盐...... 有时需要存储加密密码才能登录外部系统。 @Wooble 问题是关于如何存储密码。正如我之前的评论中所详述的那样,加密不是答案。 @hanshenrik This paper 包括对复杂度为 2^47 的 16 发简化老虎的完全碰撞,以及对复杂度为 2^47 的完整 24 发老虎的伪碰撞。这并不意味着 Tiger 在 SHA-1 级别上被破坏(基本上每个人都可以进行原像攻击),但我对这些安全边际感到不舒服。不过,我对我误解某些事情的可能性持开放态度。 非常接近,但不完全,仔细阅读,它是 23 轮的伪碰撞,而不是 24.. 但确实令人不适【参考方案2】:

您应该将密码存储为如上所述的哈希值,而不是加密。

散列函数基本上是一种单向转换,它总是为相同的输入参数产生相同的散列。应该不可能将散列转换回其原始形式,否则散列函数将被视为损坏。

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

通过将密码存储为哈希,并且由于它们是一种转换方式,即使有人掌握了数据库也无法提取它们。

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

【讨论】:

【参考方案3】:

正如 gnur 所说,您需要决定是否要散列或加密密码。如果这些是您自己用户的密码并且这些密码仅在您的系统上使用,那么使用盐和拉伸对它们进行哈希处理。在您可用的哈希算法中,使用 SHA-256 或 SHA-512。对于盐,使用 128 个随机位(16 个字节)。理想情况下使用加密 RNG,尽管非加密 RNG 会在紧要关头使用。假设攻击者无论如何都知道盐。拉伸到足以处理一个密码大约需要 0.1 秒。这将任何攻击者限制为每秒十次尝试破解密码。

如果您要存储密码以登录外部系统,则需要加密密码并在需要时对其进行解密。 DES 是您唯一真正的选择,除非您也有 3DES(又名 Triple DES 或 DESede)可用。我很惊讶 AES/Rijndael 不可用。如果是,那么我们优先于 DES。

【讨论】:

DES 在当今时代是从不的一个选项。在 PHP 领域使用 implement Rijndael (AES) 比使用非常容易损坏的 DES 更好......【参考方案4】:

你应该

使用盐作为哈希的一部分。 在超过 10,000 次迭代范围内使用 迭代 例程。例如,PBKDF#2。 使用已知的强哈希(SHA-256、SHA-512)

【讨论】:

【参考方案5】:

crc32、adler32 等并非设计用于加密安全——它们只是快速校验和算法。我认为盐渍 SHA-256 应该提供安全性和兼容性的良好组合。

在不太严重的情况下,我曾经回忆起在一个预计会承受中等负载的慢速服务器上使用 salted MD5。所以我决定用 32 位随机盐填充它,并将整个内容存储为十六进制 - 它给人的印象是整个内容是未加盐的 SHA-1。我真诚地希望有人浪费宝贵的时间在被盗的垃圾场上运行彩虹表!

安全性并不仅仅在于更昂贵的哈希 :)

【讨论】:

通过默默无闻的安全性(实际上是填充方法)不是安全性。它可能会让你在晚上感觉更好,但最终它并没有真正让它变得更安全。当你将它与它何时被破坏的概念结合起来时(它会,它只需要时间),每个人的密码都会因为更容易散列而更容易暴力破解。在大多数实现中,md5 实际上比 sha1 或 sha256 慢......所以我不知道你想要实现什么(你错过了它)......

以上是关于良好的加密哈希函数 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

证明与计算: 从加密哈希函数到一致性哈希

来自哈希函数的相同键的不同值和良好的哈希值

什么是区块链哈希算法?加密货币中哈希算法的应用有哪些?

哈希(hash) - 哈希算法的应用

哈希算法:理解数字签名加密通信的关键

理解数字签名加密通信的关键:哈希算法