• MD5 算法


    MD5

    Message Digest Algorithm MD5(中文名为消息摘要算法第 五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。该算法的文件号为RFC 1321(R.Rivest,MIT Laboratory for Computer Science and RSA Data Security Inc. April 1992)。
    MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3MD4
    MD5算法具有以下特点:
    1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。
    2、容易计算:从原数据计算出MD5值很容易。
    3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
    4、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
    MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。除了MD5以外,其中比较有名的还有sha-1RIPEMD以及Haval等。

    MD5应用

    一致性验证

    MD5的
    md5 md5
    典型应用是对一段信息(Message)产生信息摘要(Message-Digest),以防止被篡改。比如,在Unix下有很多软件在下载的时候都有一个文件名相同,文件扩展名为.md5的文件,在这个文件中通常只有一行文本,大致结构如:
    MD5 (tanajiya.tar.gz) = 38b8c2c1093dd0fec383a9d9ac940515
    这就是tanajiya.tar.gz文件的数字签名。MD5将整个文件当作一个大文本信息,通过其不可逆的字符串变换算法,产生了这个唯一的MD5信息摘要。为了让读者朋友对MD5的应用有个直观的认识,笔者以一个比方和一个实例来简要描述一下其工作过程:
    大家都知道,地球上任何人都有自己独一无二的指纹,这常常成为司法机关鉴别罪犯身份最值得信赖的方法;与之类似,MD5就可以为任何文件(不管其大小、格式、数量)产生一个同样独一无二的
    md5 md5
    数字指纹”,如果任何人对文件做了任何改动,其MD5值也就是对应的“数字指纹”都会发生变化。
    我们常常在某些软件下载站点的某软件信息中看到其MD5值,它的作用就在于我们可以在下载该软件后,对下载回来的文件用专门的软件(如Windows MD5 Check等)做一次MD5校验,以确保我们获得的文件与该站点提供的文件为同一文件。
    具体来说文件的MD5值就像是这个文件的“数字指纹”。每个文件的MD5值是不同的,如果任何人对文件做了任何改动,其MD5值也就是对应的“数字指纹”就会发生变化。比如下载服务器针对一个文件预先提供一个MD5值,用户下载完该文件后,用我这个算法重新计算下载文件的MD5值,通过比较这两个值是否相同,就能判断下载的文件是否出错,或者说下载的文件是否被篡改了。
    利用MD5算法来进行文件校验的方案被大量应用到软件下载站、论坛数据库、系统文件安全等方面。

    数字签名

    MD5的典型应用是对一段Message(字节串)产生fingerprint(指纹), 以防止被“篡改”。举个例子,你将一段话写在一个叫 readme.txt文件中,并对这个readme.txt产生一个MD5的值并记录在案,然后你可以传播这个文件给别人,别人如果修改了文件中的任何内 容,你对这个文件重新计算MD5时就会发现(两个MD5值不相同)。如果再有一个第三方的认证机构,用MD5还可以防止文件作者的“抵赖”,这就是所谓的 数字签名应用。

    安全访问认证

    MD5还广泛用于操作系统的登陆认证上,如Unix、各类BSD系统登录密码、数字签名等 诸多方面。如在Unix系统中用户的密码是以MD5(或其它类似的算法)经Hash运算后存储在文件系统中。当用户登录的时候,系统把用户输入的密码进行 MD5 Hash运算,然后再去和保存在文件系统中的MD5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可 以确定用户登录系统的合法性。这可以避免用户的密码被具有系统管理员权限的用户知道。MD5将任意长度的“字节串”映射为一个128bit的大整数,并且 是通过该128bit反推原始字符串是困难的,换句话说就是,即使你看到源程序和算法描述,也无法将一个MD5的值变换回原始的字符串,从数学原理上说, 是因为原始的字符串有无穷多个,这有点象不存在反函数的数学函数。所以,要遇到了md5密码的问题,比较好的办法是:你可以用这个系统中的md5()函数 重新设一个密码,如admin,把生成的一串密码的Hash值覆盖原来的Hash值就行了。
    正是因为这个原因,现在被黑客使用最多的一种破译密码的方法就是一种被称 为"跑字典"的方法。有两种方法得到字典,一种是日常搜集的用做密码的字符串表,另一种是用排列组合方法生成的,先用MD5程序计算出这些字典项的MD5 值,然后再用目标的MD5值在这个字典中检索。我们假设密码的最大长度为8位字节(8 Bytes),同时密码只能是字母和数字,共26+26+10=62个字节,排列组合出的字典的项数则是 P(62,1)+P(62,2)….+P(62,8),那也已经是一个很天文的数字了,存储这个字典就需要TB级的磁盘阵列,而且这种方法还有一个前提,就是能获得目标账户的密码MD5值的情况下才可以。这种加密技术被广泛的应用于Unix系统中,这也是为什么Unix系统比一般操作系统更为坚固一个重要原因。

    MD5是什么

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

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

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

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

    加密和摘要,是不一样的

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

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

    所以,当看到很多人说,md5,加密,解密的时候,呵呵一笑就好了。

    QQ截图20150311162809

    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的值

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    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的详细算法……自己搜吧。

  • 相关阅读:
    【转】SQL时间函数
    C#操作Word完全方法
    出水芙蓉,风华绝代记民国才女林徽因
    梅超风:我就是那个多年以前的女子
    厉胜男
    南海恶神
    挪窝
    吴若权——洛可可动画电影馆
    美的慢箭
    机械公敌(I, Robot) 场景设定
  • 原文地址:https://www.cnblogs.com/bolang100/p/7271962.html
Copyright © 2020-2023  润新知