【问题标题】:Is this password encryption safe enough?这个密码加密够安全吗?
【发布时间】:2014-04-01 07:50:01
【问题描述】:

我正在考虑对目前具有以下功能的系统进行简单的密码升级:

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));

我说的对吗?

【问题讨论】:

  • 你为什么在 javascript 中散列密码而不是使用 SSL;为什么还要在 PHP 中加密hash
  • 我会投票反对(两个想法)。看看crackstation.net/hashing-security.htm

标签: php encryption passwords openssl md5


【解决方案1】:

这个密码加密够安全吗?

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

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


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

您可能应该看看 Openwall 的 Portable PHP password hashing framework (phpass) 和 John Steven 的 Secure Password Storage。 Steven 甚至会带您了解威胁模型并解释您为什么这样做。

【讨论】:

  • 由于用户名可能是唯一的,所以两个相同的密码会产生不同的哈希值。但是,是的,这不是一个好的方案。
【解决方案2】:

您的方案有几个弱点。实际上,您将密码加密并丢弃了密钥。

  1. 您只需要 5 个(base64 编码的)字符作为键,所以 攻击者需要大约 1 Giga 尝试破解数据库中的哈希 (作为比较,每个人每秒可以破解 8 Giga MD5 哈希)。 这个破解的数据库哈希可以被暴力破解 md5(md5($pass) . $user) 方案,这也太快了。
  2. 由于您没有在 MD5 部分添加随机盐,因此攻击者 可以为特定帐户(如用户)准备彩虹表 “admin”,那么唯一的保护就是弱加密部分。

实际上,password_hash() 函数与标准方式相比没有任何优势。该函数将产生一个 BCrypt 哈希,成本因子决定了计算阻止暴力攻击所需的时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-23
    • 1970-01-01
    相关资源
    最近更新 更多