zoukankan      html  css  js  c++  java
  • (转)聊一聊MD5

    MD5是什么

    message-digest algorithm 5(信息-摘要算法)。经常说的“MD5加密”,就是它→信息-摘要算法。

    在下载一下东西时,经常在一些压缩包属性里,看到md5值。而且这个下载页面,很可能会在某一个地方,写了一句,此文件的MD5值为XXXXXXXXX。这有什么作用呢?

    白话白话:md5,其实就是一中算法。可以将一个字符串,或文件,或压缩包,执行md5后,就可以生成一个固定长度为128bit的串。这个串,基本上是唯一的。

    所以,有人修过压缩包后,就会生成新的串,这时就可以拿网站提供的串和新生成的串对比,如果不同,那就是被人修过过了。

    加密和摘要,是不一样的

    加密后的消息是完整的;具有解密算法,得到原始数据;

    摘要得到的消息是不完整的;通过摘要的数据,不能得到原始数据;

    MD5长度

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

    md5的长度,默认为128bit,也就是128个0和1的二进制串。

    这样表达是很不友好的。

    所以将二进制转成了16进制,每4个bit表示一个16进制,

    所以128/4 = 32 换成16进制表示后,为32位了。

    QQ截图20150305111855

    为什么网上还有md5是16位的呢?

    网上有很多帖子,md5 32位 16位 加密 区别。

    仔细观察admin生成的32位和16位的md5值……

    查询结果:

    md5(admin,32) = 21232f297a57a5a743894a0e4a801fc3

    md5(admin,16) = 7a57a5a743894a0e

    看出来了吧!

    其实16位的长度,是从32位md5值来的。是将32位md5去掉前八位,去掉后八位得到的。

    MD5的作用

    ①一致性检验,最上面那个例子

    ②数字签名,还是最上面那个例子。只是把md5看出了一个指纹,按了个手印说明独一无二了。

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

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

    md5不能破解吗?

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

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

    md5是唯一的吗?

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

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

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

    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();
        }
    }

    MD5的详细算法……自己搜吧。

    另外,二进制转16进制字符串:

    public String byte2hex(byte[] b) {
            StringBuffer buf = new StringBuffer("");
            String stmp = "";
             for (int offset = 0; offset < b.length; offset++) {
                    stmp = Integer.toHexString(b[offset]&0XFF);
                    if(stmp.length() == 1)
                       buf.append("0").append(stmp);
                    else
                       buf.append(stmp);
             }
             return buf.toString();
        }                       
  • 相关阅读:
    Linux下修改Apache即httpd的端口
    jenkins.JenkinsException: Error in request. Possibly authentication failed
    jenkins-python 获取正在运行的Job
    通过python-jenkins 获取job的输出日志
    电子公文传输系统团队项目
    接口重复请求报错问题排查
    创建couchbase的bucket 提示RAM不够用 all the ram in the cluster is already allocated to existing bucekets,delete some buckets,,
    tornado重定向的几种方式
    tornado进行登录案例
    tornado设置cookie和查看cookie,含加密
  • 原文地址:https://www.cnblogs.com/xingxing0521/p/5653280.html
Copyright © 2011-2022 走看看