MD5和SHA512尺寸和安全性

时间:2014-09-16 00:49:55

标签: php security encryption hash cryptography

据我所知,如果你谈论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

2 个答案:

答案 0 :(得分:7)

<强>前言

MD5和SHA-x都不适合密码哈希;忽略了MD5被加密破坏的事实,并且应该逐步淘汰,两个哈希族都太快并且不适合这个问题 - 这是因为哈希太快了,人类经常选择弱/糟糕的密码严重危及域名,这使得强制执行MD5 / SHA-x密码变得切实可行。

对于密码哈希,请改用bcrypt(通过crypt),这是任何自尊的PHP版本中的标准。其他选项,不是PHP提供的标准,是scrypt甚至更脆弱的PBKDF2。

最佳要做的事情不是重新发明轮子,而是使用现有/经过测试的库,它将使用有效的哈希算法(即.bcrypt),并缓解数据库访问不正确的问题从PHP 5.5+开始,可以使用password_hashpassword_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位 - 长度的两倍。

相关问题