我有一个朋友是一名白帽黑客。他说md5并不是真的那么糟糕,实际上如果我们使用得当,它是非常安全的。
我相信他是正确的。据我所知,有三种方法可以破解哈希值:
1.使用彩虹表(可以通过长/随机盐进行保护)
2.碰撞(可以通过多个盐或哈希来防止-如下面的例子)
3.生成时间(如果我们为每个用户使用足够长的盐值,这就不太重要了-AFAIK)
我和我的朋友认为,Blowfish并不是真正必要的,而且它可能会有害,因为它可能会减慢密码验证过程,并且即使使用更少的攻击资源,也可以用于DDOS攻击来拆毁服务器。
因此,我想确保以下算法是否真的安全?还有,是否有真正的理由选择Blowfish哈希算法?
我相信他是正确的。据我所知,有三种方法可以破解哈希值:
1.使用彩虹表(可以通过长/随机盐进行保护)
2.碰撞(可以通过多个盐或哈希来防止-如下面的例子)
3.生成时间(如果我们为每个用户使用足够长的盐值,这就不太重要了-AFAIK)
我和我的朋友认为,Blowfish并不是真正必要的,而且它可能会有害,因为它可能会减慢密码验证过程,并且即使使用更少的攻击资源,也可以用于DDOS攻击来拆毁服务器。
因此,我想确保以下算法是否真的安全?还有,是否有真正的理由选择Blowfish哈希算法?
// return a 256 bit salt + 128 bit md5 binary hash value
function hash(password, salt=null)
{
salt = (salt != null) ? salt : Random256BitBinaryValueGenerator();
// What about using another user-specified parameter, like email address as salt?
return salt + md5(salt + password) + md5(password + salt);
// Or just use a non-cryptographic hash algorithm like crc32 to prevent collisions:
// return salt + md5(salt + password) + crc32(salt + password);
// Or even use two different salts:
// return salt + md5(salt + password) + md5('C' + salt + password);
}
// check password
function check(password, hash_value)
{
return hash(password, substring(hash_value, 0, 32)) == hash_value;
}