MD5 加密
MD5长度
有人说md5,128位,32位,16位,到底md5多长?
md5的长度,默认为128bit,也就是128个0和1的二进制串。
这样表达是很不友好的。
所以将二进制转成了16进制,每4个bit表示一个16进制,
所以128/4 = 32 换成16进制表示后,为32位了。
为什么网上还有md5是16位的呢?
网上有很多帖子,md5 32位 16位 加密 区别。
仔细观察admin生成的32位和16位的md5值……
看出来了吧!
其实16位的长度,是从32位md5值来的。是将32位md5去掉前八位,去掉后八位得到的。
查询结果:
md5(admin,32) =
21232f297a57a5a743894a0e4a801fc3
md5(admin,16) = 7a57a5a743894a0e
Java语言中生成MD5的值 特点
public class MD5Test { //main测试类 public static void main(String[] args) { String result = getMD5("aaa"); System.err.println(result); } /** * 生成md5 * @param message * @return */ public static String getMD5(String message) { String md5str = ""; try { //1 创建一个提供信息摘要算法的对象,初始化为md5算法对象 MessageDigest md = MessageDigest.getInstance("MD5"); //2 将消息变成byte数组 byte[] input = message.getBytes(); //3 计算后获得字节数组,这就是那128位了 byte[] buff = md.digest(input); //4 把数组每一字节(一个字节占八位)换成16进制连成md5字符串 md5str = bytesToHex(buff); } catch (Exception e) { e.printStackTrace(); } return md5str; } /** * 二进制转十六进制 * @param bytes * @return */ public static String bytesToHex(byte[] bytes) { StringBuffer md5str = new StringBuffer(); //把数组每一字节换成16进制连成md5字符串 int digital; for (int i = 0; i < bytes.length; i++) { digital = bytes[i]; if(digital < 0) { digital += 256; } if(digital < 16){ md5str.append("0"); } md5str.append(Integer.toHexString(digital)); } return md5str.toString().toUpperCase(); }
public static String makeSignMD5_32(String data, String appkey) throws Exception{
StringBuilder localStringBuilder = new StringBuilder();
BASE64Encoder base64en = new BASE64Encoder();
MessageDigest localMessageDigest = MessageDigest.getInstance("MD5");
byte[] arrayOfByte = localMessageDigest.digest((data+appkey).getBytes("utf-8"));
for (int i = 0; i < arrayOfByte.length; i++)
{
String k = Integer.toHexString(arrayOfByte[i] & 0xFF);
if (k.length() == 1) {
localStringBuilder.append("0");
}
localStringBuilder.append(k);
}
String Ret= base64en.encode(localStringBuilder.toString().getBytes());
return Ret;
}
}
加密字符串
逻辑思维:
-
1.获取信息摘要对象:md5
通过信息摘要单例的构造函数获取:
MessageDigest md5 = MessageDigest.getInstance("MD5");
-
2.信息摘要对象是对字节数组进行摘要的,所以先获取字符串的字节数组.
byte[] bytes = str.getBytes();
-
3.信息摘要对象对字节数组进行摘要,得到摘要字节数组:
byte[] digest = md5.digest(bytes);
-
4.把摘要数组中的每一个字节转换成16进制,并拼在一起就得到了MD5值.
(PS,有些转换过来得到的是前面有6个f的情况,如:ffffff82,这是因为前面有6组4个1,所以提前把这6组1111先变成0就好了,然后再转16进制就没有f了)
(其实也可以在后面续把f去掉)