【问题标题】:Password encryption algorithm密码加密算法
【发布时间】:2015-05-27 15:29:33
【问题描述】:

我想开发一个 Web 应用程序,用户可以在其中登录并插入他们的电子邮件和密码(注册时选择)。我想知道哪个是最好的密码哈希算法。我读过 bcrypt 是一个不错的选择,但是像 facebook 这样的网站使用什么算法?

【问题讨论】:

  • 通过编码,你尝试过什么?
  • 第一步,学习加密和散列的区别。答案:scrypt 或 bcrypt。
  • 它是一个 JavaEE 应用程序。这是我使用的 SHA256 算法 mkyong.com/java/java-sha-hashing-example ,但我想知道最好的选择

标签: security web passwords


【解决方案1】:

您需要在数据库中存储哈希和盐,并使用它们进行身份验证。当我实现这个时,这篇文章对我特别有帮助:http://www.codeproject.com/Articles/704865/Salted-Password-Hashing-Doing-it-Right

【讨论】:

    【解决方案2】:

    您不应该存储密码,即使它是加密的。因为加密的东西可以被解密,所以攻击者也可以这样做。 谷歌“散列”和“加盐”,也许 OWASP 有一些建议如何正确地做到这一点。我认为,存储加密密码将出现在要避免的漏洞列表中。

    【讨论】:

    • @Adelphia 虽然我觉得有点被敲诈了,但我可以回答你这个问题:你不把密码存储在“明文”中,你只是存储它的哈希值,它是通过一个聪明的算法计算出来的这是不可逆转的。简而言之:如果您将密码保存在文件中,攻击者可以获取该文件,然后他就知道您的密码。如果您存储一个哈希值(这只是一些十六进制值,例如 '2a73f5b8b625a600c180ea44fe04e8c2dec52311' 他没有获得太多收益。当用户在您的应用程序中输入密码时,您只需计算哈希值并将其与存储的值进行比较。
    • @Adelphia 我还在等 ;-)
    【解决方案3】:

    我编写了 2 个处理密码的函数。第一个接受一个字符串(即您的密码)并返回一个种子哈希。它需要时间的 MD5 哈希并将其添加到字符串中。然后它需要该字符串的 SHA256 哈希。然后它将原始 MD5 散列添加到 SHA256 散列中。该函数返回这个 96 个字符的字符串。第二个函数将 2 个字符串作为此参数(正在测试的密码和您对其进行测试的密码哈希)并返回一个布尔值。这是PHP,但逻辑当然是可以移植的。

    function hash_password( $password ){
        $md5 = strtoupper( hash( 'md5', time() ) );
        $hash = $md5 . strtoupper( hash( 'sha256', $md5 . $password ) );
        return $hash;
        }
    
    function test_password( $password, $hash ){
        $md5 = substr( $hash, 0, 32 );
        $sha256 = substr( $hash, 32 );
    
        if( $sha256 == strtoupper( hash( 'sha256', $md5 . $password ) ) )
            return true;
        else
            return false;
        }
    

    【讨论】:

    • 这是一个已解决的问题。你不应该自己写!
    • PHP 具有内置功能:password_hash.
    • SHA-* 适合散列密码,因为它太快了,因此很容易被暴力破解。相反,我们使用具有成本因子的慢速哈希函数,例如 BCrypt 或 PBKDF2。 password_hash() 的编写正是为了避免使用 MD5 和 SHA-* 编写此类代码。
    猜你喜欢
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    • 2014-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-30
    • 2014-04-17
    相关资源
    最近更新 更多