2015-11-18 58 views
-1

我决定在最近的一个项目中使用双重密码认证。 登录细节是:电子邮件,密码,秘密。双密码认证

密码(分8 CHR)和秘密(分钟6 CHR)是两个密码。

为了使困难尽可能地砍他们,我想我应该使用的OpenSSL加密的用户名,并使用两个密码加密密钥和初始化向量。

openssl_encrypt($email, 'aes-256-cbc', $password, false, $secret) 

这是安全还是我刚想出一个坏主意?

+1

看看'password_hash',其单向散列,http://php.net/manual/en/function.password-hash.php – Andrew

+0

需要我存储密码。我的想法是不存储密码,只是基于它们的加密用户名 – transilvlad

+0

是什么让你觉得两个密码比一个好?这不是通常意味着两个认证的双因素认证:你知道的东西(例如:密码),你有的东西(例如:RSA fob)或你是的东西(例如:指纹)。 – zaph

回答

0

您将需要在数据库中保存某种信息。你所做的与主要做的和Andrew上面发布的内容非常相似。密码安全散列的一般方式是为每个用户生成一些独特的盐,在你的情况下你已经决定根据秘密来做到这一点,但你可以安全地使用某种随机信息。

然后,通过使用这种盐哈希此密码,并节省盐和数据库中的哈希密码。当用户输入密码进行验证时,只需使用该用户的盐进行哈希即可,如果它与哈希值相匹配,那么它们已成功验证,但由于您对密码进行了散列处理,因此对于获得访问权限的用户到你的数据库来扭转这个过程,因为他们需要单独破解每个密码(或者用彩虹表/等等)。

你发布的是以上标准的一个版本。

+2

*“然后使用这个盐来散列这个密码”* - 如果这是对'password_hash()'的引用,那么额外的咸味已从PHP 7.0中移除,建议不要创建它们自己的salt。 –

+0

我指的是通常生成安全哈希的过程,而不是专门用于password_hash函数。谢谢你的观点! – DaOgre

+0

所以我认为我的方法同样安全? – transilvlad

3

这是安全的或有我只是想出了一个馊主意?

你是rolling your own crypto,所以在这个意义上它是一个坏主意。

至于安全性:openssl_encrypt()预计参数$password是加密密钥,而不是人类可读的密码。同样,IV应该是随机的每个消息字符串。对两种输入使用人类可读的值是危险的。 (具体来说,你对蛮力更加敏感。)

这听起来像你想使用password_hash() + password_verify(),然后用你的“秘密”字段中的双因素认证解决方案(例如Yubikey,谷歌认证器)集成。