C# java MD5加密方不一致问题

说来惭愧,做开发几年了,一直在吸取,今天也写写自已关于技术的一点点理解,不正之处,请大家多多指点。

由于之前开发的项目使用的是C#,用户信息使用的C#的MD5加密码方式,而现在需要切换到Java平台下,关键问题是如何将用户信息通过Java方式的MD5加密码到与C#同样的结果。

经过查询资料与测试,Java与C#默认的MD5加密结果是一致的,主要是编码问题。

测试一:

C#代码  默认编码加密

 1   class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             String cleanString = "111111";
 6
 7
 8             System.Console.Write(MD5(cleanString));
 9
10
11             Console.Read();
12
13         }
14
15
16         public static string MD5(string sText)
17         {
18             Byte[] clearBytes =Encoding.Default.GetBytes(sText);
19             Byte[] hashedBytes = ((HashAlgorithm)CryptoConfig.CreateFromName("MD5")).ComputeHash(clearBytes);
20             return BitConverter.ToString(hashedBytes);
21         }
22     }

Java代码  默认编码加密

 1 public static void main(String[] args) throws NoSuchAlgorithmException,
 2             UnsupportedEncodingException {
 3         String s = "111111";
 4       System.out.println(makeMD5(s)); ;
 5
 6     }
 7
 8     public static String makeMD5(String password) {
 9         MessageDigest md;
10         try {
11             md = MessageDigest.getInstance("MD5");
12             md.update(password.getBytes());
13             byte[] bPwd=md.digest();
14             String pwd = new BigInteger(1, bPwd) .toString(16);
15             if(pwd.length()%2==1){
16                 pwd="0"+pwd;
17             }
18             int length=pwd.length();
19             StringBuffer sb=new StringBuffer(length+length/2-1);
20             for(int i=0;i<length;i+=2){
21                 sb.append(pwd.substring(i, i+2));
22                 if(i+2<length)
23                     sb.append("-");
24             }
25             return sb.toString().toUpperCase();
26         } catch (Exception e) {
27             e.printStackTrace();
28         }
29         return password;
30     }

说明:为了C#达到一致的格式,这里做了循环格式化

测试二 Unicode编码

C# 将 上述代码中

1  Byte[] clearBytes =Encoding.Default.GetBytes(sText);

修改为

1  Byte[] clearBytes =Encoding.Unicode.GetBytes(sText);

结果:

70-66-A4-0F-42-77-69-CC-43-34-7A-A9-6B-72-93-1A

Java 将

1 md.update(password.getBytes()); 

修改为:

1 md.update(password.getBytes("UTF-16LE")); 

结果:

70-66-A4-0F-42-77-69-CC-43-34-7A-A9-6B-72-93-1A

经过多轮测试,结果如下:

java与C#通过MD5加密结果不致,一般都是编码问题,下面列出编码对照

JAVA(加密码111111) C#(加密码111111)
US-ASCII 96-E7-92-18-96-5E-B7-2C-92-A5-49-DD-5A-33-01-12 ASCII 96-E7-92-18-96-5E-B7-2C-92-A5-49-DD-5A-33-01-12
ISO-8859-1  96-E7-92-18-96-5E-B7-2C-92-A5-49-DD-5A-33-01-12 ISO-8859-1 96-E7-92-18-96-5E-B7-2C-92-A5-49-DD-5A-33-01-12
UTF-8
96-E7-92-18-96-5E-B7-2C-92-A5-49-DD-5A-33-01-12

UTF-8 96-E7-92-18-96-5E-B7-2C-92-A5-49-DD-5A-33-01-12
UTF-16BE AA-61-7C-C9-92-81-C9-F5-1C-A0-72-9D-B9-30-FD-3D BigEndianUnicode AA-61-7C-C9-92-81-C9-F5-1C-A0-72-9D-B9-30-FD-3D
UTF-16LE 70-66-A4-0F-42-77-69-CC-43-34-7A-A9-6B-72-93-1A Unicode 70-66-A4-0F-42-77-69-CC-43-34-7A-A9-6B-72-93-1A
UTF-16 6A-97-04-80-3E-CC-65-94-2F-A4-4E-F7-3A-11-B7-80 -  
-   UTF-7 96-E7-92-18-96-5E-B7-2C-92-A5-49-DD-5A-33-01-12
-   UTF-32 B7-7D-95-DB-0C-A3-41-3E-0F-79-F4-C5-47-F8-25-E5

java编码:http://docs.oracle.com/javase/6/docs/api/java/nio/charset/Charset.html

以上是个人一点总结,欢迎指正!

时间: 2024-11-15 12:06:24

C# java MD5加密方不一致问题的相关文章

js和java MD5加密

项目中用到js MD5加密和后台java MD5加密,刚开始加密后两个不一致,网上找了好久终于找到一个啦,记下来: md5.js /* * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message * Digest Algorithm, as defined in RFC 1321. * Version 2.1 Copyright (C) Paul Johnston 1999 - 2002. * Other co

java MD5加密

今天在写注册登录的时候想起来为密码做一个加密,于是去网上搜索用哪方面的技术,最后确定了java自带的MD5单向加密,这个好处就是加密以后是无法解密的,有利于数据的安全,代码比较少,但是需要认真理解为什么要这样写,我先把代码贴出来. 我是需要把密码加密成一个32位的字符串 public class MD5 { public static String getHash(String password) throws NoSuchAlgorithmException { ///获取MD5算法实例 得到

Java md5加密 控制台传入与web传入参数 结果不匹配 || 相同字符串加密结果不同

开发中遇到md5加密不一致问题,排除了上下文编码,加密内容问题. 爬了各类资料,最终找到了原因. /** 对字符串进行MD5加密 */ private static String encodeByMD5(String originString) { if (originString != null) { try { // 创建具有指定算法名称的信息摘要 MessageDigest md = MessageDigest.getInstance("MD5"); // 使用指定的字节数组对摘

Java: md5 加密中文 &amp; 注意编码

今天使用java的md5加密一个字符串(含有部分中文),遇到问题,百思不得其解. 后面网上搜索了一下,才知道是[编码]的问题. 以前在asp中用md5加密的时候,了解 gb2312和utf-8编码下,md5加密结果不一样. 我没想到java也有类似的问题,不过解决办法倒很简单: 原来的代码: 1 alg.update(txt.getBytes(encoding)); 只需修改为: 1 2 3 4 5 6 7 8 try         {             alg.update(txt.g

Java MD5加密与RSA加密

区别: MD5加密: 加密时通过原字符串加密成另一串字符串 解密时需要原加密字符串进行重新加密比较两次加密结果是否一致 T=RSA加密: 加密时通过原字符串生成密钥对(公钥+私钥) 解密时通过公钥和私钥进行解密,解密出原字符串进行比较是否一致 个人观点: RSA加密略比MD5加密牛逼一点点 但凡事都有好坏    MD5加密执行效率比RSA慢 废话不多说上栗子: MD5加密: package cn.news.util; import java.security.MessageDigest; /**

java MD5加密工具类

1 import java.math.BigInteger; 2 import java.security.MessageDigest; 3 import java.security.NoSuchAlgorithmException; 4 5 public class MD5Utils { 6 /** 7 * 使用md5的算法进行加密 8 */ 9 public static String md5(String plainText) { 10 byte[] secretBytes = null;

C#,Java,MD5加密对等实现

1.c#实现 /* *加密生成MD5 */ public static String MD5(string s) { char[] hexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; MD5 md5 = new MD5CryptoServiceProvider(); byte[] inputBytes = System.Text.Encoding.UTF8.

Java MD5加密类

1 /************************************************* 2 md5 类实现了RSA Data Security, Inc.在提交给IETF 3 的RFC1321中的MD5 message-digest 算法. 4 *************************************************/ 5 public class MD5 { 6 /* 下面这些S11-S44实际上是一个4*4的矩阵,在原始的C实现中是用#define

Java MD5 加密

MessageDigest md5 = null; try { md5 = MessageDigest.getInstance("MD5"); } catch (Exception e) { System.out.println(e.toString()); e.printStackTrace(); return ""; } byte[] by = str.getBytes(); byte[] md5Bytes = md5.digest(by); StringBuf