MD5摘要算法以及一个汉字占多少字节的讨论

转载: 

http://blog.csdn.net/hbtj_1216/article/details/52241318

一个汉字占多少字节?
转载: https://www.zhihu.com/question/20451870
UTF-8编码是变长编码,通常汉字占三个字节,扩展B区以后的汉字占四个字节。

 

MD5介绍

MD5 即 message-digest algorithm 5(信息-摘要算法)。

MD5是一种算法。可以将一个字符串,或文件,或压缩包,执行md5后,能够生成一个固定长度为128bit的串。这个串,基本上是唯一的。

所以,如果有人修改过源文件,就会生成新的md5串。

 

 

MD5只是一个摘要算法,并不是加密算法

 

(1)加密后的消息是完整的。具有解密算法,能够得到原始数据。

(2)摘要得到的消息是不完整的。通过摘要的结果,不能得到原始数据。

 

//声明消息摘要对象
MessageDigest md = null;
//创建消息摘要
md = MessageDigest.getInstance("MD5");

//将数据newJsonString传给消息摘要对象
md.update(newJsonString.getBytes("UTF-8")); 
//获得消息摘要的字节数组
 byte[] digest = md.digest();

  

  

byte[] digest = md.digest();得到 byte[] 数组是 十进制的ASCII码,格式如 代码: newJsonString.getBytes("UTF-8"); 得到的数据,
举例:
String str = "a";
str.getBytes("UTF-8"); 得到的返回值是 97 。

然后用如下代码转成 32位的16进制字符串。

public static String byteToHexString(byte[] b) {
    StringBuffer hexString = new StringBuffer();
    for (int i = 0; i < b.length; i++) {
        String hex = Integer.toHexString(b[i] & 0xFF);
        if (hex.length() == 1) {
            hex = '0' + hex;
        }
        hexString.append(hex.toUpperCase());
    }
    return hexString.toString();
}

  

MD5长度问题

 

有人说md5,128位,32位,16位,到底md5多长?

md5的长度,默认为128bit,也就是128个0和1的二进制串。这样表达是很不友好的。

所以将二进制转成了16进制,每4个bit表示一个16进制,所以128/4 = 32 换成16进制表示后,为32位了。

而16位的md5,是从32位md5值来的。16位的md5是将32位md5去掉前八位,去掉后八位得到的。

MD5的作用

 

①一致性检验,比如很多网站提供下载文件的md5值。

②数字签名,还是检验问题。只是把md5看成一个指纹,作为独一无二的标识。

③安全访问认证,这个就是平时系统设计的问题了。

在用户注册时,会将密码进行md5加密,存到数据库中。这样可以防止那些可以看到数据库数据的人,恶意操作了。

 

md5不能破解吗?

md5是不可逆的,也就是没有对应的算法,从生产的md5值逆向得到原始数据。

但是如果使用暴力破解,那就另说了。

 

md5是唯一的吗?

md5作为数据库中的主键可行吗?这就涉及到一个问题,md5值是唯一的吗?答案是,不唯一。

一个原始数据,只对应一个md5值;

但是一个md5值,可能对应多个原始数据。

 

spring框架中DigestUtils工具生成md5

 

引入:

import org.springframework.util.DigestUtils;  

  

posted on 2017-08-30 10:37  tuyf_hs  阅读(859)  评论(0编辑  收藏  举报