2013-03-10 56 views
1

我试图将字符串列表中的两个字符串转换为MD5消息摘要。MD5 Message Digest Java

我的字符串列表被称为“usernamepassword”。

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); 
     } 

我的问题是 -

答:是这样做的正确方法是什么? B:我如何返回它,以便我可以在另一个类中使用每个单独的MD5哈希值?

+0

您应该使用bcrypt或scrypt或PBKDFv2。 – SLaks 2013-03-10 20:11:24

回答

4

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的盐会是更好,但对于真正安全的应用程序,您应该阅读一些有关该主题的现代文献。 (我不是专家,所以不想听起来太权威。)

+1

5)您正在使用MD5,一种具有已知漏洞的算法,快速输出并且没有盐,用于密码 – SLaks 2013-03-10 20:10:26

+0

谢谢@JonSkeet - 将更多地读入它。我跟着几个Youtube视频,但他们似乎让我误入歧途。 – 2013-03-10 20:12:00

+0

@SLaks - 由于该程序不会发布,所以我不会太费心使用哪种加密方法。但是,谢谢你的头! – 2013-03-10 20:12:48

1

使用apache公共类中的DigestUtils类。几种实用方法将帮助你计算/显示一个md5或其他一些常见的散列函数。