MD5加密结果不一致
关于java C# MD5加密结果方不一致问题
MD5加密得到的结果一般是16位或者32位,不管是什么语言MD5加密都是一样的(除非更改了加密算法)
例如,当C# java MD5加密方不一致的时候
- 确定两边的编码是否一致
java MD5加密
public static String getMd5(String passord) throws NoSuchAlgorithmException, UnsupportedEncodingException {
StringBuilder pwd = new StringBuilder("");
MessageDigest md = MessageDigest.getInstance("MD5");// 生成一个MD5加密计算摘要
byte[] digest1 = md.digest(passord.getBytes("UTF-16LE"));
// byte[] digest1 = passord.getBytes("UTF-16LE");
for (int i = 0; i < digest1.length; i++)
{
//将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母,如果使用大写(X)则格式后的字符是大写字符
// pwd = pwd + digest1[i].toString("x");
int v = digest1[i] & 0xFf;
String hv = Integer.toHexString(v);
if (hv.length() < 2) {
pwd.append(0);
}
pwd.append(hv);
}
// MD5 md5 = new MD5CryptoServiceProvider();
return pwd.toString();
}
C# MD5加密
public string Encrypt(string src)
{
string pwd = "";
//pwd = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(src, "md5");
MD5 md5 = MD5.Create();
//加密后是一个字节类型的数组
byte[] s = md5.ComputeHash(Encoding.Unicode.GetBytes(src));
//通过使用循环,将字节类型的数组转换为字符串,此字符串是常规字符格式化所得
for (int i = 0; i < s.Length; i++)
{
//将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母,如果使用大写(X)则格式后的字符是大写字符
pwd = pwd + s[i].ToString("x");
}
return pwd;
}
分别对java加密123456,和C#加密123456
java得到结果 32位
5fa285e1bebe0a6623e33afc04a1fbd5
C#得到结果 30位
5fa285e1bebea6623e33afc4a1fbd5
两边用到的加密都是Unicode编码,为什么java加密比C#加密多了两个0
因为之前那个项目是用C#进行md5加密的,我用java进行md5加密发现得到的结果不一样
问题如下
public static String getMd5(String passord) throws NoSuchAlgorithmException, UnsupportedEncodingException {
StringBuilder pwd = new StringBuilder("");
MessageDigest md = MessageDigest.getInstance("MD5");// 生成一个MD5加密计算摘要
byte[] digest1 = md.digest(passord.getBytes("UTF-16LE"));
// byte[] digest1 = passord.getBytes("UTF-16LE");
for (int i = 0; i < digest1.length; i++)
{
//将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母,如果使用大写(X)则格式后的字符是大写字符
// pwd = pwd + digest1[i].toString("x");
int v = digest1[i] & 0xFf;
String hv = Integer.toHexString(v);
if (hv.length() < 1) {
pwd.append(0);
}
pwd.append(hv);
}
// MD5 md5 = new MD5CryptoServiceProvider();
return pwd.toString();
}
if (hv.length() < 2) {
pwd.append(0);
}
改为
if (hv.length() < 1) {
pwd.append(0);
}
下面分享下java和C#两边的编码对应
| java | C# |
|---|---|
| US-ASCII | ASCII |
| ISO-8859-1 | ISO-8859-1 |
| UTF-8 | UTF-8 |
| UTF-16BE | BigEndianUnicode |
| UTF-16LE | Unicode |