所以我知道MD5在新应用程序中在技术上是禁止的,但我随机想到了这个:
自
md5($password);
不安全,不会
md5(md5($password))
是一个更好的选择吗? 我使用的越多,它会越来越安全吗?假如我做了这样的功能
function ExtremeEncrypt($password) { $encryptedpass = md5(sha1(md5(md5($pass)))); return $encryptedpass; }
对于像vbulletin这样的每个帐户使用随机盐,这个函数是否是一个很好的选择。
答案 0 :(得分:8)
对字符串进行双重散列除了限制键空间并更有可能发生冲突之外什么都不做。请不要这样做。双md5散列实际上不如具有一些攻击向量的单个散列安全。
更好的选择是在php 5.5或ircmaxell的password_hash库中使用password_compat函数用于早期的php版本。
答案 1 :(得分:5)
第一个:哈希和加密不一样。 Hash是一种单向函数,而加密期望数据可以被解密。
在安全方面,不会尝试创建自己的解决方案。在PHP中,从5.5版本开始,有一个名为Password Hashing的本机解决方案。 md5()
是insecure,你应该知道这一点。
如果您的PHP版本低于5.5,则应使用salt哈希&存储您的密码。
答案 2 :(得分:2)
你在这里有很多答案而且准确无误,但他们并没有真正解释为什么。
MD5是一种散列算法。 Hashing算法的作用是获取一长段数据,并以创建较小数据的方式对其进行加密分析。因此,从ABCDEFGHIJKLMNOPQRSTUVWXYZ
使用我的自定义哈希算法,我可能会创建一个数字哈希5
。
完成后,您会丢失信息 - ABCDEFGHIJKLMNOPQRSTUVWXYZ
包含的信息远远超过5
,并且无法以其他方式进行翻译。
散列的问题只允许0-9的结果(这实际上是一个校验和),如果你拿两个文本,那么它们具有相同散列的可能性很高。因此,使用我的算法ZZZZZZZZZ
也可能会生成5
的哈希值。这就是所谓的 Hash Collision 。
现在如果我拿哈希哈希值会发生什么?好吧,我的出发点已经是非常低的信息 - 最可能的是十位数之一,因此碰撞的可能性现在非常高。假设我的哈希算法在数字上运行时,如果它是奇数则返回1
,如果它是偶数则返回0
- 如果我有ABCDEFGHIJKLMNOPQRSTUVWXYZ
的哈希到5
然后我有10%的碰撞几率。但是如果我对哈希进行哈希处理,我现在有50%的机会发生冲突。
密码学的技巧是将信息隐藏在如此巨大的可能空间中,令人难以置信地难以找到。缩小可能的空间越多,隐藏的信息就越少。
答案 3 :(得分:0)
简短回答:否。
使用蛮力很容易打破md5。添加额外的散列层只会线性地减缓暴力攻击。答案 4 :(得分:-3)
首先,md5并不是真正的加密,因为它没有解密方法。它被称为散列。
标准做法是加密密码:
$salt = [some random/unique number, people usually use user_id or timestamp]
$hashed_password = sha1($salt . $password)
请记住,您需要知道盐,因此通常意味着将其与散列密码一起存储。
您可以拥有多种盐,并根据需要进行排列。