这个密码加密足够安全吗?

时间:2014-02-28 10:48:52

标签: php encryption passwords openssl md5

我正在考虑对系统进行简单的密码升级,目前这个系统有类似的内容:

md5(md5($pass) . $user);

密码将在发送之前通过JavaScript哈希算法,这总是使三个字符的密码大约20多个字符。

我认为使用哈希密码的末尾作为KEY和IV加密其余应该就足够了。

$pass = '20_plus_characters_long';
$hash = openssl_encrypt(substr($pass, 5, -5), 'aes-128-cbc', substr($pass, 0, 5), false, md5(substr($pass, -5), true));

我说错了吗?

2 个答案:

答案 0 :(得分:0)

您的计划存在一些缺点。实际上你加密密码并扔掉钥匙。

  1. 您只使用5个(base64编码)字符作为键,因此 攻击者需要大约1吉加试图破解数据库中的哈希 (为了比较,每个人每秒可以破解8 Giga MD5哈希值)。 然后,这个破解的数据库哈希可以强制使用 md5(md5($pass) . $user)计划,这也太快了。
  2. 由于您没有在MD5部分添加随机盐,因此是攻击者 可以为用户等特定帐户准备彩虹表 “admin”,那么唯一的保护就是弱加密部分。
  3. 实际上,使用password_hash()功能的标准方式没有优势。此函数将生成BCrypt哈希值,并且成本因子确定计算所需的时间以阻止暴力攻击。

答案 1 :(得分:0)

  

此密码加密是否足够安全?

可能不是,但这取决于您的威胁模型。

具有相同密码的两个用户在密码数据库中具有相同的条目。这是PRP安全性(伪随机排列)的损失。也就是说,攻击者将能够将随机答案与真实答案区分开来。


  

md5(md5($pass) . $user);

你应该看看Openwall的Portable PHP password hashing framework (phpass)和John Steven的Secure Password Storage。史蒂文甚至带你通过威胁模型并解释你为什么做事。