我决定在最近的一个项目中使用双重密码认证。 登录细节是:电子邮件,密码,秘密。双密码认证
密码(分8 CHR)和秘密(分钟6 CHR)是两个密码。
为了使困难尽可能地砍他们,我想我应该使用的OpenSSL加密的用户名,并使用两个密码加密密钥和初始化向量。
openssl_encrypt($email, 'aes-256-cbc', $password, false, $secret)
这是安全还是我刚想出一个坏主意?
我决定在最近的一个项目中使用双重密码认证。 登录细节是:电子邮件,密码,秘密。双密码认证
密码(分8 CHR)和秘密(分钟6 CHR)是两个密码。
为了使困难尽可能地砍他们,我想我应该使用的OpenSSL加密的用户名,并使用两个密码加密密钥和初始化向量。
openssl_encrypt($email, 'aes-256-cbc', $password, false, $secret)
这是安全还是我刚想出一个坏主意?
您将需要在数据库中保存某种信息。你所做的与主要做的和Andrew上面发布的内容非常相似。密码安全散列的一般方式是为每个用户生成一些独特的盐,在你的情况下你已经决定根据秘密来做到这一点,但你可以安全地使用某种随机信息。
然后,通过使用这种盐哈希此密码,并节省盐和数据库中的哈希密码。当用户输入密码进行验证时,只需使用该用户的盐进行哈希即可,如果它与哈希值相匹配,那么它们已成功验证,但由于您对密码进行了散列处理,因此对于获得访问权限的用户到你的数据库来扭转这个过程,因为他们需要单独破解每个密码(或者用彩虹表/等等)。
你发布的是以上标准的一个版本。
*“然后使用这个盐来散列这个密码”* - 如果这是对'password_hash()'的引用,那么额外的咸味已从PHP 7.0中移除,建议不要创建它们自己的salt。 –
我指的是通常生成安全哈希的过程,而不是专门用于password_hash函数。谢谢你的观点! – DaOgre
所以我认为我的方法同样安全? – transilvlad
这是安全的或有我只是想出了一个馊主意?
你是rolling your own crypto,所以在这个意义上它是一个坏主意。
至于安全性:openssl_encrypt()
预计参数$password
是加密密钥,而不是人类可读的密码。同样,IV应该是随机的每个消息字符串。对两种输入使用人类可读的值是危险的。 (具体来说,你对蛮力更加敏感。)
这听起来像你想使用password_hash()
+ password_verify()
,然后用你的“秘密”字段中的双因素认证解决方案(例如Yubikey,谷歌认证器)集成。
看看'password_hash',其单向散列,http://php.net/manual/en/function.password-hash.php – Andrew
需要我存储密码。我的想法是不存储密码,只是基于它们的加密用户名 – transilvlad
是什么让你觉得两个密码比一个好?这不是通常意味着两个认证的双因素认证:你知道的东西(例如:密码),你有的东西(例如:RSA fob)或你是的东西(例如:指纹)。 – zaph