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去掉)
浙公网安备 33010602011771号