【问题标题】:Generating a MD5 hash from a char[]从 char[] 生成 MD5 哈希
【发布时间】:2017-05-24 10:12:19
【问题描述】:

我找到了解决这个问题的方法here

private byte[] toBytes(char[] chars) {
    CharBuffer charBuffer = CharBuffer.wrap(chars);
    ByteBuffer byteBuffer = Charset.forName("UTF-8").encode(charBuffer);
    byte[] bytes = Arrays.copyOfRange(byteBuffer.array(),
            byteBuffer.position(), byteBuffer.limit());
    Arrays.fill(charBuffer.array(), '\u0000'); // clear sensitive data
    Arrays.fill(byteBuffer.array(), (byte) 0); // clear sensitive data
    return bytes;
}

char[] stringChars = "String".toCharArray();
byte[] stringBytes = toBytes(stringChars);

MessageDigest md = MessageDigest.getInstance("MD5");
md.update(stringBytes);
String stringHash = new BigInteger(1, md.digest()).toString(16);

Arrays.fill(stringChars, '\u0000');
Arrays.fill(stringBytes, (byte) 0);

但它似乎有一个错误,我无法弄清楚它发生在哪里或如何发生。

问题是我认为的这部分:

String hashedPass = new BigInteger(1, md.digest()).toString(16);

上面代码的输出给出了字符串:

String = "9a9cce201b492954f0b06abb081d0bb4";
Correct MD5 of above string = "0e67b8eb546c322eeb39153714162ceb",
The code above though gives = "e67b8eb546c322eeb39153714162ceb";

似乎缺少 MD5 的前导零。

【问题讨论】:

  • This answer 建议简单地用零填充左-我不知道是否有更好的解决方案。
  • @Blorgbeard 非常感谢您链接该帖子,对于该问题似乎有很多不同的(有效的)解决方案。一个比另一个更安全吗?
  • 如果您将 MD5 用于需要安全的事情,您应该切换算法。你实际上在用这些哈希做什么?
  • 那些主要是存储的哈希值,用于通过 http post 在服务器之间进行通信,其值只有客户端和服务器知道,因此它们可以在不实施加密的情况下以“安全方式”进行通信。我还没有找到实现 https 通信的方法。不过,我已经将 MessageDigest 更改为 SHA1,因为无论如何它都没有意义。
  • 所以它们基本上是用作 GUID 的?

标签: java security hash md5


【解决方案1】:

你不必为这个任务使用BigInteger,只需编写一个将字节数组转换为十六进制字符串的方法。

static String hexEncode(byte [] data) {
    StringBuilder hex = new StringBuilder();
    for (byte b : data) hex.append(String.format("%02x", b));
    return hex.toString();
}

String hash = hexEncode(md.digest());

【讨论】:

  • 非常感谢!我现在用这个: StringBuffer sb = new StringBuffer(); for (byte b : digest) {sb.append(String.format("%02x", b & 0xff));} 这也解决了前导零问题。不知道如何在这些 cmets 中使用代码……这真的很烦人。
猜你喜欢
  • 2015-08-14
  • 1970-01-01
  • 1970-01-01
  • 2011-07-26
  • 2011-08-17
  • 1970-01-01
  • 2013-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多