1

我正在尝试将字符串列表中的两个字符串转换为 MD5 消息摘要。

我的字符串列表称为“用户名密码”。

try {
            MessageDigest mdg = MessageDigest.getInstance("MD5");      

            mdg.update(usernamepassword.get(0).getBytes(), 0, usernamepassword.get(0).length());
            mdg.update(usernamepassword.get(1).getBytes(), 1, usernamepassword.get(0).length());     


        } catch (NoSuchAlgorithmException ex) {
            Logger.getLogger(UPCheck.class.getName()).log(Level.SEVERE, null, ex);
        }

我的问题是——

A:这是正确的做法吗?B:我将如何返回它以便我可以在另一个类中使用每个单独的 MD5 哈希?

4

2 回答 2

5

A:这是正确的做法吗?

不,有四个原因:

1)您使用的是默认字符编码,而不是指定特定的编码。我建议使用 UTF-8。

2)您当前正在使用字符串的长度(以字符为单位)来指定要使用的字节数

3)如果您想要单独的摘要(每个字符串一个),您应该MessageDigest为每个摘要使用单独的实例,或者在调用reset之间调用

4)你现在实际上并没有对摘要做任何事情。

我建议您将“特定编码中字符串的 MD5”提取到单独的方法中:

public static byte[] getMd5OfUtf8(String text) {
    try {
        MessageDigest digest = MessageDigest.getInstance("MD5");      
        return digest.digest(text.getBytes("UTF-8"));
    } catch (NoSuchAlgorithmException ex) {
        throw new RuntimeException("No MD5 implementation? Really?");
    } catch (UnsupportedEncodingException ex) {
        throw new RuntimeException("No UTF-8 encoding? Really?");
    }
}

然后你可以为你感兴趣的每个列表元素调用它 - 不清楚你之后要对摘要什么,但你可能想要单独使用它们......

编辑:正如评论中所指出的,MD5 这些天真的不是一个很好的哈希选择。像带有盐的 SHA-256 这样的东西会更好,但是对于真正安全的应用程序,您可能应该阅读一些有关该主题的现代文献。(我不是专家,所以不想听起来太权威。)

于 2013-03-10T20:10:09.580 回答
1

使用DigestUtils来自 apache commons 的类。几种实用方法将帮助您计算/显示 md5 或其他一些常见的哈希函数。

于 2013-03-10T20:16:38.470 回答