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

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

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

测试一:

C#代码  默认编码加密

   class Program
{
static void Main(string[] args)
{
String cleanString = ""; System.Console.Write(MD5(cleanString)); Console.Read(); } public static string MD5(string sText)
{
Byte[] clearBytes =Encoding.Default.GetBytes(sText);
Byte[] hashedBytes = ((HashAlgorithm)CryptoConfig.CreateFromName("MD5")).ComputeHash(clearBytes);
return BitConverter.ToString(hashedBytes);
}
}

Java代码  默认编码加密

 public static void main(String[] args) throws NoSuchAlgorithmException,
UnsupportedEncodingException {
String s = "111111";
System.out.println(makeMD5(s)); ; } public static String makeMD5(String password) {
MessageDigest md;
try {
md = MessageDigest.getInstance("MD5");
md.update(password.getBytes());
byte[] bPwd=md.digest();
String pwd = new BigInteger(1, bPwd) .toString(16);
if(pwd.length()%2==1){
pwd="0"+pwd;
}
int length=pwd.length();
StringBuffer sb=new StringBuffer(length+length/2-1);
for(int i=0;i<length;i+=2){
sb.append(pwd.substring(i, i+2));
if(i+2<length)
sb.append("-");
}
return sb.toString().toUpperCase();
} catch (Exception e) {
e.printStackTrace();
}
return password;
}

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

测试二 Unicode编码

C# 将 上述代码中

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

修改为

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

结果:

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

Java 将

 md.update(password.getBytes()); 

修改为:

 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

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

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

  1. js和java MD5加密

    项目中用到js MD5加密和后台java MD5加密,刚开始加密后两个不一致,网上找了好久终于找到一个啦,记下来: md5.js /* * A JavaScript implementation of ...

  2. js MD5加密与 java MD5加密不一致

    因为该项目会部署到多台机器,所以需要用字符生成唯一的MD5,但是js生成的MD5和java生成的MD5不一致.经过博主查阅资料发现java生成MD5用的是utf-8的编码,而且js用的是2进制.那我就 ...

  3. Java md5加密 控制台传入与web传入参数 结果不匹配 || 相同字符串加密结果不同,如何保证JAVA MD5加密结果在不同的环境下都相同

    开发中遇到md5加密不一致问题,排除了上下文编码,加密内容问题. 爬了各类资料,最终找到了原因. /** 对字符串进行MD5加密 */ private static String encodeByMD ...

  4. 那些年java MD5加密字符编码的坑

    相信做过MD5加密的童鞋都遇到过字符编码的坑,一般加密出来的结果和其他人不一样都是字符编码不一致导致的,比如类文件的字符编码.浏览器的字符编码等和对方不一致,所以就需要转码统一字符. 以下是笔者转码过 ...

  5. Java MD5加密与RSA加密

    区别: MD5加密: 加密时通过原字符串加密成另一串字符串 解密时需要原加密字符串进行重新加密比较两次加密结果是否一致 T=RSA加密: 加密时通过原字符串生成密钥对(公钥+私钥) 解密时通过公钥和私 ...

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

    今天使用java的md5加密一个字符串(含有部分中文),遇到问题,百思不得其解. 后面网上搜索了一下,才知道是[编码]的问题. 以前在asp中用md5加密的时候,了解 gb2312和utf-8编码下, ...

  7. MySql md5加密 sqlserver md5加密 C# md5加密 java md5加密

    便民md5加密: 百度md5加密: MySQL 加密语法: MD5(加密字符串) -- 中文加密 SELECT MD5('你好') -- 中文加密匹配查询 SELECT * FROM 表名 WHERE ...

  8. java MD5加密的工具类

    import java.security.MessageDigest; /** * MD5加密工具类 * @author zwq */ public class MD5Util { /** * MD5 ...

  9. java md5加密 不依赖base64包

    /** * MD5 加密 */ private String getMD5Str(String str) { MessageDigest messageDigest = null; try { mes ...

随机推荐

  1. mysql通过data文件恢复数据库的方式

    1.首先定位mysql的my.ini配置文件,查找datadir的位置 #Path to the database rootdatadir="C:/ProgramData/MySQL/MyS ...

  2. nginx安装过程,报错处理:make[1]: *** [objs/addon/src/bson.o] Error 1

    nginx安装过程中,经常会有各种错误: 具体安装步骤这里不做说明,网上一搜大把: 主要分析安装过程中遇到的问题 在make编译的时候,若报如下错误: cc1: warnings being trea ...

  3. cocos游戏的真正入口,用C++实现的demo版本

    1.cocos游戏的出发点 在main函数中有一句:   return CCApplication::sharedApplication()->run(); 2.经过层层深入发现,真正的入口:  ...

  4. ubuntu13.04装配oracle11gR2

    http://jingyan.baidu.com/album/bea41d435bc695b4c41be648.html?picindex=2 http://www.360doc.com/conten ...

  5. C语言——打印魔方阵(每一行,每一列,对角线之和相等)

    <一>魔方阵说明: 魔方阵是一个N*N的矩阵: 该矩阵每一行,每一列,对角线之和都相等: <二>魔方阵示例: 三阶魔方阵: 8   1   6 3   5   7 4   9 ...

  6. 读阿里巴巴Java开发手册v1.2.0之工程结构有感【架构篇】

    首先,把昨天那俩条sql语句的优化原因给大家补充一下,第一条效率极低,第二条优化后的,sql语句截图如下: 经过几个高手的评论和个人的分析: 第一条sql语句查询很慢是因为它首先使用了in关键字查询, ...

  7. [JSOI2007]祖码Zuma

    题目描述 这是一个流行在Jsoi的游戏,名称为祖玛. 精致细腻的背景,外加神秘的印加音乐衬托,彷佛置身在古老的国度里面,进行一个神秘的游戏——这就是著名的祖玛游戏.祖玛游戏的主角是一只石青蛙,石青蛙会 ...

  8. 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之九 || 依赖注入IoC学习 + AOP界面编程初探

    更新 1.如果看不懂本文,或者比较困难,先别着急问问题,我单写了一个关于依赖注入的小Demo,可以下载看看,多思考思考注入的原理: https://github.com/anjoy8/BlogArti ...

  9. 你应该要知道的vue.js

    前言 小组同事最近都在学习前端,目前我们小组前端技术栈主要是vue.在和同事交流过程成,发现他们对vue都不了解,所以整理了问的比较多的问题. 组件data为什么必须是函数? 因为组件可能被多处使用, ...

  10. Oracle一次可以查询多个表的结果的方法

    select (select count(1) from gspauresult) 权限总表, (select count(1) from gspau01result) 权限总表1, (select ...