据我所知,如果你谈论md5
它可以存储32 characters
。我知道如果你超过32 characters
,它仍然会完全正常,但实际上可能与hash
md5( 'a' )
相同,但不太可能。
在salt
中使用(md5)md5
甚至不检查input
+的password
长度是不是非常危险和不安全salt
?
示例1:
$pass = md5( 'this is a password' );
$salt = md5( 'this is a salt' );
// Will exceed 32 range and might therefore equal md5( 'a' ) -
// if so this will pass an authorization such as login
md5( $pass . $salt );
示例2:
// 32 character password
$pass = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
$salt = 'salt';
// Will also exceed 32 range due to no length check and might equal md5( 'a' )
md5( $pass . $salt );
你不应该这样做:
$pass = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
$salt = 'salt';
if ( strlen( $pass ) + strlen( $salt ) > 32 )
exit;
else
md5( $pass . $salt );
此外,sha512
的限制在哪里? 512 characters
?
答案 0 :(得分:7)
<强>前言强>
MD5和SHA-x都不适合密码哈希;忽略了MD5被加密破坏的事实,并且应该逐步淘汰,两个哈希族都太快并且不适合这个问题 - 这是因为哈希太快了,人类经常选择弱/糟糕的密码严重危及域名,这使得强制执行MD5 / SHA-x密码变得切实可行。
对于密码哈希,请改用bcrypt(通过crypt
),这是任何自尊的PHP版本中的标准。其他选项,不是PHP提供的标准,是scrypt甚至更脆弱的PBKDF2。
最佳要做的事情不是重新发明轮子,而是使用现有/经过测试的库,它将使用有效的哈希算法(即.bcrypt),并缓解数据库访问不正确的问题从PHP 5.5+开始,可以使用password_hash
和password_verify
函数,尽管它仍然只是系统的一部分。
<强>响应强>:
MD5的输出(范围)是32个十六进制字符,代表128位; 输入(域)实际上是无限制的。对于SHA-512,值分别为128个字符/ 512位。 (注意,所考虑的有效安全性的位数 less 比该范围内的实际位数。)
由于既没有 MD5也没有SHA-x是完美的散列函数,那么将在域上发生冲突,即使它小于范围 - 但是范围是如此之大(并且有效的cryto-hash具有某些属性),它并不重要。
也就是说,得到的散列不能保证唯一,而是(尤其是更多位)它是extremely improbable that a duplicate will be accidentally (or even purposefully) found。可以通过Birthday Problem估计预期的碰撞率;鸽子洞原则也适用,但在此之前 a 重复的几率非常接近100%,这种情况并不适用。
但是,在适当的设计中,不是问题。这是因为cryptographic hash functions are designed with certain properties(这也解释了为什么MD5在这样的角色中不适合):
理想的加密哈希函数有四个主要属性:
- 很容易计算任何给定消息的哈希值
- 生成具有给定哈希的消息
是不可行的- 修改邮件而不更改哈希
是不可行的- 使用相同的哈希
找到两个不同的消息是不可行的
请记住,截至SHA-1/2/3上已有no [reported] found collisions。这是因为它们仍然是合适的加密散列函数。 (参见duskwoof关于SHA-1的评论。)
另外,考虑到less atoms in the observable universe(10 ^ 80或~2 ^ 280)比SHA-512哈希的范围!这是加密哈希函数被认为是安全的原因之一/部分原因。
答案 1 :(得分:0)
不,它不危险/不安全。没有真正的安全要求,两个不同的密码不会对同一凭证进行身份验证!实际上,您可能会认为MD5将唯一地散列所有前2 ^ 32-1值 - 事实上并非如此。
事实上,MD5并没有&#34;存储&#34;任何形式的独特价值。有许多值将散列到任何给定的MD5输出。
sha2 / 512,顾名思义,哈希中的512位 - 长度的两倍。