MD5和SHA512尺寸和安全性

Kae*_*ear 0 php security encryption hash cryptography

据我所知,如果你谈论md5它可以存储32 characters.我知道,如果超过限制,32 characters它仍然会凑它完美的罚款,但它实际上可能是相同hashmd5( 'a' ),虽然,不可能.

是不是可能是非常危险和不安全然后使用(MD5)saltmd5,甚至没有检查的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 );
Run Code Online (Sandbox Code Playgroud)

例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 );
Run Code Online (Sandbox Code Playgroud)

你不应该这样做:

$pass = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
$salt = 'salt';

if ( strlen( $pass ) + strlen( $salt ) > 32 ) 
  exit;

else
  md5( $pass . $salt );
Run Code Online (Sandbox Code Playgroud)

另外,限制在sha512哪里?512 characters

use*_*740 7

前言:

既不 MD5也不SHA-x分别适于密码哈希值; 忽略了MD5在加密方面被破坏并且应该逐步淘汰的事实,两个哈希族都太快而且不适合这个问题 - 这是因为哈希太快了,而且人们经常选择弱/差密码,这严重损害了域,这使得强制MD5/SHA-x密码变得实用.

对于密码散列,请使用bcrypt代替(via crypt),这是任何自尊的PHP构建中的标准.其他选项,不是PHP提供的标准,是scrypt甚至更脆弱的PBKDF2.

最好做的事情是不是重新发明轮子,但使用方法,使用有效的哈希算法(即bcrypt)现有/测试库,并减轻与不正确的数据库访问,认证测试,产生盐等作为问题可以使用PHP 5.5+ password_hashpassword_verify函数,尽管它仍然只是系统的一部分.


回应:

MD5 的输出(范围)是32个十六进制字符,代表128位; 的输入(域)是有效无界的.对于SHA-512,值分别为128个字符/ 512位.(注意,所考虑的有效安全性的位数小于该范围内的实际位数.)

由于既不 MD5也不SHA-X是完美的散列函数那么就会是在域碰撞即使它是小于的范围内- 但幅度如此巨大(和有效cryto哈希具有一定的属性),它只是没有按"无所谓.

也就是说,产生的散列不能保证唯一,而是(尤其是更多的位),不可能偶然(或甚至有目的地)发现重复.可以通过生日问题估计预期的碰撞率; 鸽子洞的原则也适用,但几率一个副本是如此的无限接近100%,在此之前,这样是不是很适用.

但是,这在正确的设计中不是问题.这是因为加密哈希函数设计具有某些属性(这也解释了为什么MD5 不适合这样的角色):

理想的加密哈希函数有四个主要属性:

  • 很容易计算任何给定消息的哈希值
  • 生成具有给定哈希的消息是不可行的
  • 在不更改哈希值的情况下修改消息是不可行的
  • 找到具有相同散列的两个不同消息是不可行的

请记住,截至目前尚未发现[报告]发现 SHA-1/2/3上的碰撞.这是因为它们仍然是合适的加密散列函数.(参见duskwoof关于SHA-1的评论.)

另外,考虑到可观察宇宙中的原子数(10 ^ 80或~2 ^ 280)比SHA-512哈希的范围少!这是加密哈希函数被认为是安全的原因/方式的一部分.