md5加密 java原理_Java MD5加密原理分析及代码示例

由于MD5的不可逆,所以有的网站会把密码转换MD5,然后存储。但是这种算法并不是100%严密的,参考MD5 - 维基百科

下面就写写MD5在Java中的使用。

主要分为四步

定义一个char数组,存储16进制的基本字符

char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8',

'9', 'A', 'B', 'C', 'D', 'E', 'F' };

其中的英语字符可以大写也可以小写,取决于你要的结果是大写还是小写。比如

123456转换后

大写是E10ADC3949BA59ABBE56E057F20F883E

小写是e10adc3949ba59abbe56e057f20f883e

获取Java中的MD5类,用于把输入的字符进行信息摘要运算,得到一个byte数组。

MessageDigest md = null;

try {

md = MessageDigest.getInstance("MD5");

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

}

md.reset();

md.update(str.getBytes());

byte[] bArray = md.digest();

这个byte数组是2进制的数据,下一步我们要把2进制转换成16进制

转换16进制,这一步是关键

protected static char[] encodeHex ( final byte[] data, final char[] toDigits){

final int len = data.length;

final char[] out = new char[len <

for (int i = 0, j = 0; i 

out[j++] = toDigits[(0xF0 & data[i]) >>> 4];

out[j++] = toDigits[0x0F & data[i]];

}

return out;

}

<< 和 >>> 都是java的位移操作符

在说明之前需要解释一下2进制到16进制的转换,

把data[i]的高四位(data[i]>>>4) 和0xF0做 & 运算((0xF0 & data[i]) >>> 4),得到16进制高1位

把data[i]的低四位(data[i]) 和0xF0做 & 运算,得到16进制低1位

上面两句得到的值都是0到15,这样就得到toDigits数组的位置对应的字符。

final char[] out = new char[len <

这个语句表示要定义一个输出数组(out[]),长度是需要转换数组(date[])的2倍。

为什么要是2倍呢,因为2进制的128位,要对应16进制的32位,一个byte是八位二进制,也就是2位十六进制字符(2的8次方等于16的2次方)

最后一步就是把得到的char数组转换成字符串输出。

下面是完整代码

public static String StringMD5(String str){

char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8',

'9', 'A', 'B', 'C', 'D', 'E', 'F' };

MessageDigest md = null;

try {

md = MessageDigest.getInstance("MD5");

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

}

md.reset();

md.update(str.getBytes());

byte[] bArray = md.digest();

String finalStr = new String(encodeHex(bArray, hexDigits));

System.out.println("16位大写:" + finalStr.substring(8, 24));

System.out.println("32位大写:" + finalStr);

return finalStr;

}

protected static char[] encodeHex ( final byte[] data, final char[] toDigits){

final int len = data.length;

final char[] out = new char[len <

for (int i = 0, j = 0; i 

out[j++] = toDigits[(0xF0 & data[i]) >>> 4];

out[j++] = toDigits[0x0F & data[i]];

}

return out;

}

补充几点:网上有很多Java中MD5的加密实现,和本文所提内容主要区别就是2进制转换16进制

本文是自己写的2进制转换16进制,网上的大部分是利用了java的方法直接转换的,比如

Integer.toHexString(bt)

所以碰到这些也不要迷惑,只是实现不同而已。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值