Kae*_*ear 0 php security encryption hash cryptography
据我所知,如果你谈论md5
它可以存储32 characters
.我知道,如果超过限制,32 characters
它仍然会凑它完美的罚款,但它实际上可能是相同hash
的md5( 'a' )
,虽然,不可能.
是不是可能是非常危险和不安全然后使用(MD5)salt
中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 );
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
?
前言:
既不 MD5也不SHA-x分别适于密码哈希值; 忽略了MD5在加密方面被破坏并且应该逐步淘汰的事实,两个哈希族都太快而且不适合这个问题 - 这是因为哈希太快了,而且人们经常选择弱/差密码,这严重损害了域,这使得强制MD5/SHA-x密码变得实用.
对于密码散列,请使用bcrypt代替(via crypt
),这是任何自尊的PHP构建中的标准.其他选项,不是PHP提供的标准,是scrypt甚至更脆弱的PBKDF2.
在最好做的事情是不是重新发明轮子,但使用方法,使用有效的哈希算法(即bcrypt)现有/测试库,并减轻与不正确的数据库访问,认证测试,产生盐等作为问题可以使用PHP 5.5+ password_hash
和password_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哈希的范围少!这是加密哈希函数被认为是安全的原因/方式的一部分.
归档时间: |
|
查看次数: |
618 次 |
最近记录: |