• 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;  
    

      

  • 相关阅读:
    【译】用 Chart.js 做漂亮的响应式表单
    【译】快速高效学习Java编程在线资源Top 20
    【译】理解Spring MVC Model Attribute 和 Session Attribute
    Github 恶搞教程(一起『玩坏』自己的 Github 吧)
    Effective Java 读书笔记(一):使用静态工厂方法代替构造器
    JavaScript 中 onload 事件绑定多个方法的优化建议
    【译】常见 Java 异常解释(恶搞版)
    Java 重写 equals 与 hashCode 的注意事项
    【译】Java语言速览:StackOverflow
    【译】StackOverflow——Java 中的 finally 代码块是否总会被执行?
  • 原文地址:https://www.cnblogs.com/tuyf/p/7451889.html
Copyright © 2020-2023  润新知