Java中的密码哈希方法

时间:2011-07-09 15:59:05

标签: java password-protection

public static String encryptPassword( String password ) {
    String encrypted = "";
    try {
        MessageDigest digest = MessageDigest.getInstance( "MD5" ); 
        byte[] passwordBytes = password.getBytes( ); 

        digest.reset( );
        digest.update( passwordBytes );
        byte[] message = digest.digest( );

        StringBuffer hexString = new StringBuffer();
        for ( int i=0; i < message.length; i++) 
        {
            hexString.append( Integer.toHexString(
                0xFF & message[ i ] ) );
        }
        encrypted = hexString.toString();
    }
    catch( Exception e ) { }
    return encrypted; 
}

我正在使用Java。我使用这种方法来散列密码,并且在存储到数据库时它正确工作。现在我对解密有困难。有没有比这个方法更有效的方法?

2 个答案:

答案 0 :(得分:12)

你不能解密它。 MD5是hash - 它是单向的,与双向加密算法不同。

您通常不应该尝试来解密密码 - 您存储哈希(盐渍,理想情况下),然后将“已知良好”哈希值与给您的密码哈希值进行比较用户以后。

(这些天我个人会避免使用MD5,但这是另一个故事。)

答案 1 :(得分:5)

MD5是hash function,即单向函数。无法“解密”MD5代码。

虽然对加密应用程序没用,但哈希码通常用于以下应用程序:

  • 密码存储:
    当用户最初注册时,他提供的密码被提交给哈希函数,结果代码保存在文件中。当他/她尝试登录时,他传递的凭证将被提交到相同的散列函数,并且将如此生成的代码与保存在文件中的散列代码进行比较。这种方法的有趣好处是,即使有人访问了与用户密码相对应的哈希码列表,他/她也无法知道密码是什么,因为如果哈希函数不可逆转。
  • 检测数据记录的变化
    MD5代码提供了一个简短的代码,可以概括整个记录的内容(概率相对较低,但不可能不同的记录内容可能具有相同的MD5值);然后,可以使用此代码检测记录是否已修改,而无需访问原始记录。这用于欺诈检测,也用于快速计算批量更新的数据集的差异更新集。
  • 提供用于数据库索引的密钥再次由于MD5与原始数据相比较短,MD5或其他散列码提供了一种为数据构建相对紧凑的索引的方法,该索引可能很长。

如果您必须 ... [存储密码以便以后可以检索它们]和BTW,有许多用例需要这样做(例如提供给第3个派对网站代表您的应用程序的各种用户等登录。)...
...你应该使用诸如Blowfish,DES,AES之类的encryption algorithm(我在这里只提到对称密钥加密,因为虽然也可以使用公钥加密,但它不会出现这就是我们所需要的。)

请务必仔细阅读有关加密和加密的内容,因为实现非常安全的加密 - 解密应用程序相对容易:-(还要记住算法只有一个整个链中的元素(通常是“更容易”的元素)。