转载:
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;