gpt4 book ai didi

java - 在java中生成MD5字符串

转载 作者:行者123 更新时间:2023-11-30 03:36:59 25 4
gpt4 key购买 nike

我尝试在java中生成md5字符串。我写了一些代码,我可以生成md5字符串,但我有问题我第一次向你展示我的代码

public class MD5Hash
{

public static void main(String args[])
{

computeMD5Hash("dbox#service" + "2014-12-24T18:34:49");
}

public static void computeMD5Hash(String password)
{
try
{
// Create MD5 Hash
MessageDigest digest = java.security.MessageDigest.getInstance("MD5");

digest.update(password.getBytes("UTF-16"));
digest.update(password.getBytes());

byte messageDigest[] = digest.digest();
StringBuffer MD5Hash = new StringBuffer();

for (int i = 0; i < messageDigest.length; i++)
{
String h = Integer.toHexString(0xFF & messageDigest[i]);

while (h.length() < 2)
h = "0" + h;

MD5Hash.append(h);
}

// result.setText("MD5 hash generated is: " + " " + MD5Hash);
System.out.println("MD5 hash generated is: " + " " + MD5Hash);

}
catch (NoSuchAlgorithmException e)
{
e.printStackTrace();
}
}
}

正如我所说,我可以接收 md5 字符串,但我的 friend 是 .net 开发人员,他也编写了代码,而我的 md5 字符串不同。这是他的 C# 代码

 public static string CreateMD5(string plain)
{
MD5 md5 = MD5.Create();
byte[] inputBytes = Encoding.Unicode.GetBytes(plain);
byte[] hashBytes = md5.ComputeHash(inputBytes);
StringBuilder sb = new StringBuilder();

for (int i = 0; i < hashBytes.Length; i++)
{
sb.Append(hashBytes[i].ToString("x2"));
}

return sb.ToString();
}

somethink 在我的 Java 代码中是错误的,因为我希望我的 Md5 字符串发送到服务器,当我将我的 md5 字符串发送到服务器时,我遇到错误 - 我的 friend 没有...我的代码有什么问题如果有人知道解决方案请帮助我谢谢

最佳答案

差异原因:编码

程序之间的区别在于用于将字符串的字符转换为字节的编码。

使用的C#程序UTF-16LE

您 friend 的 C# 程序正在使用 Encoding.Unicode.GetBytes()默认为 UTF-16LE从而产生ea15fbcf2123906e6fcb9f2a3b243492 .

Java 程序使用了其他东西

您的 Java 程序正在使用 String.getBytes()默认为当前区域设置的编码(可能类似于 UTF-8Windows-1252 ,但显然向后兼容 US-ASCII-7 ),从而产生 70F00E5BD872BD73EC6A8B4B8C8C9FEF .

同意某事

您必须决定实际应该使用哪种编码。我想说,对于这样的用例,使用 UTF-8最常见,建议你们都同意 UTF-8 。但无论如何,你们都需要在某些事情上达成一致。

如何使用特定编码,如 UTF-8UTF-16LE在Java中

更换线路

digest.update(password.getBytes());

digest.update(password.getBytes(StandardCharsets.UTF_16LE));

digest.update(password.getBytes(StandardCharsets.UTF_8));

您还可以使用 StandardCharsets 中定义的字符集之外的字符集。在这种情况下,您需要使用 String String.getBytes() 的参数版本并处理UnsupportedEncodingException ,像这样:

try {
digest.update(password.getBytes("ISO-8859-15"));
} catch (final UnsupportedEncodingException e) {
throw new AssertionError(e);
}

程序的更好版本

  • 使用可变参数来表示main()所以可以用 Md5Sum.main() 来调用它而不是Md5Sum.main(new String[0]);测试时。
  • 重构print进入return .
  • 使用 Formatter用于将字节转换为十六进制 String因为它更方便:它使用 StringBuilder这比 StringBuffer 更快,它提供了 format()方法使转换更加简单。
  • 创建变量 final因为我们永远不会重新分配它们。
  • 替换for -循环 foreach -循环,因为我们不使用索引变量。
  • 我们不打印堆栈跟踪并继续,而是说我们期望 MD5可用,如果不可用,则这是我们程序的内部错误并中止。崩溃的程序比损坏的程序造成的损害要小。
public class Md5Sum {
public static void main(final String... args) {
final String md5sum = md5sum("dbox#service" + "2014-12-24T18:34:49");
System.out.println("MD5 hash generated is: " + md5sum);
}
public static String md5sum2(final String plaintext) {
try {
final Formatter formatter = new Formatter();
final MessageDigest digest = MessageDigest.getInstance("MD5");
digest.update(plaintext.getBytes(StandardCharsets.UTF_16LE));
for (final byte b : digest.digest())
formatter.format("%02x", b);
return formatter.toString();
} catch (final NoSuchAlgorithmException e) {
throw new AssertionError(e);
}
}
}

该程序的更好版本

  • 将函数拆分为多个函数,以便可以单独使用(测试、重用)它们。
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Formatter;

import static java.nio.charset.StandardCharsets.UTF_16LE;

public class Md5Sum {
public static void main(final String... args) {
final String md5sum = md5sum("dbox#service" + "2014-12-24T18:34:49");
System.out.println("MD5 hash generated is: " + md5sum);
}

public static String md5sum(final String plaintext) {
return toHexString(md5sum(plaintext.getBytes(UTF_16LE)));
}

private static byte[] md5sum(final byte... bytes) {
final MessageDigest digest = createMD5();
digest.update(bytes);
return digest.digest();
}

private static MessageDigest createMD5() {
try {
return MessageDigest.getInstance("MD5");
} catch (final NoSuchAlgorithmException e) {
throw new AssertionError(e);
}
}

private static String toHexString(final byte... bytes) {
final Formatter formatter = new Formatter();
for (final byte b : bytes)
formatter.format("%02X", b);
return formatter.toString();
}
}

关于java - 在java中生成MD5字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27641464/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com