精华内容
下载资源
问答
  • 主要介绍了Python hashlib常见摘要算法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 在上一篇文章 【算法大杂烩】常见算法的归类和总结——非... 常见的信息摘要算法有哪些以及它们的特性和区别是什么? 信息摘要算法的应用场景有哪些? 什么是信息摘要算法?  信息摘要算法是一种对“信息”进行...

           在上一篇文章  【算法大杂烩】常见算法的归类和总结——非对称加密算法  中我们简要介绍了常见的非对称加密算法的相关知识。这次我们乘胜追击,介绍【信息摘要算法】, 通过本文的阅读,你可以了解到以下知识:

    • 什么是信息摘要算法?
    • 常见的信息摘要算法有哪些以及它们的特性和区别是什么?
    • 信息摘要算法的应用场景有哪些?

    什么是信息摘要算法?


           信息摘要算法是一种对“信息”进行【摘要化】处理的算法。通俗地来说,就好比本文,假设它很长,那么读者在第一时间看到它的时候并不会完全阅读全文,而是往往会先去读一下文章的【摘要】,通过文章的摘要部分,简要了解下文章的主要内容。类似地,在信息密码学领域,同样有这种的操作,这就是信息摘要算法的产生背景。

           假设有一段数据(专业术语叫“消息”),经过【信息摘要算法】处理后,它将变成一段固定长度的【信息摘要】,用公式表示如下,其中M表示消息原文,D表示输出的消息摘要,P表示信息摘要算法。

    • P(M with any length) = D(with fixed length)

           通过公式,我们可以很直观地看出,信息摘要算法的输入数据长度是可以为任意长度,但是在实际使用的过程中,倘若输入数据的长度过于长,我们会采用将输入数据块采用数据分组的方式一步步输入,最后得到信息摘要结果的输出。而输出的信息摘要,通常都是固定长度的,至于信息摘要结果的固定长度是多少,是与具体的摘要算法相关的,下文会详细介绍各种信息摘要算法的摘要输出情况。

           还有一点,公式中并没有体现“加密和解密的相互过程”,也就是说【信息摘要算法是单向的,不可逆的】。严格来说,它并不是一种【加密】算法,仅仅是【摘要】算法。由于它计算的不可逆性,所以经信息摘要算法计算出来的信息摘要D,一定程度上就代表了信息原文M。倘若有原文M1和原文M2,经过相同的信息摘要算法P,得到相同的信息摘要D,这种情况在密码学上,我们称之为【碰撞】。一般而言, 好的摘要算法,没有人能从中找到【碰撞】或者说极度难找到。虽然【碰撞】是肯定存在的(碰撞即不同的内容产生相同的摘要),但因目前信息科学发达程度非常高,计算机的运算能力得到了前所未有的提升,仅通过计算机运算的暴力破解,某些较弱的信息摘要算法就能被【碰撞】成功。


    常见的信息摘要算法


            常见的信息摘要算法有:MD2/4/5、SHA1/SHA224/SHA256/SHA384、SM3算法、MAC算法等。

    MD(Message Digest):消息摘要

            MD算法,是诞生于比较早的消息摘要算法,在网络应用上也比较常见,比如在某个网站上下载一个文件,通常它会标识该文件的MD5值,当下载者完成下载文件到本地之后,使用工具对下载的文件执行MD5计算,求出一个MD5摘要值,与网站上给出的参考MD5值进行对比;如果两者相等,则表示下载的文件是可靠的,没有被篡改过的;反之,如果MD5值对不上,则表明下载的文件是被篡改过的,可能是网络攻击者投放的病毒携带文件或者是在下载的过程中文件出现了损坏等情况,此时应该对文件进行删除操作。

            MD系列的算法主要有MD2、MD4、MD5,数字值越大表示MD算法的版本越高,从安全性上说:MD5 > MD4 > MD2,自然破解难度MD5是最高的。

             MD系列的信息摘要算法,输出的信息摘要长度都是固定的128bits,即16字节;当不同的信息输入时,产生的信息摘要也不相同;反之,当信息摘要相同,我们可以认为信息的明文是相同的。

    SHA(Secure Hash Algorithm):安全散列

           SHA系列的算法从版本上划分有SHA-1和SHA-2;SHA-1和SHA-2是该算法的两个不同版本。它们两者之间在构造上(散列结果是怎样被原始数据创建出来的)和签名的位数上都有不同和签名的位长。你应该把SHA-2看作是SHA-1的继承者,因为这是一个整体上的改进。

           SHA-1就是我们常见到的SHA1;SHA-2主要有SHA224、SHA256、SHA384、SHA512等等,不同的数字代表信息摘要输出的位数。与MD系列算法类似,数字值越高表示摘要算法的安全性越高,计算的复杂性也越大;但不同于MD算法的是,SHA算法每个算法输出的信息摘要长度是不一样的。

    • SHA1,产生的信息摘要为160bits,即20字节
    • SHA224,产生的信息摘要为224bits,即28字节
    • SHA256,产生的信息摘要为256bits,即32字节
    • SHA384,产生的信息摘要为384bits,即48字节  
    • SHA512,产生的信息摘要为512bits,即64字节

           更为详细的SHA算法介绍,可以参考: https://www.cnblogs.com/block2016/p/5632234.html

    SM(Shangyong Mima):国密算法,即商用密码

            经查证,国密算法的英文字母缩写SM,其实是【码】的中文拼音首字母简写。国密即国家密码局认定的国产密码算法,即商用密码。

            在国密算法的列表中,SM3算法就是实现了类似MD算法和SHA算法的信息摘要算法。它和其他2种摘要算法一样,都是不同长度的信息输入,产生固定长度的摘要输出。不同的是,它输出的信息摘要长度固定为256bits,即32字节。在实际使用过程中,SM3算法比较少会单独使用,而是配合SM2【非对称加密算法】配合使用,实现数字验签和消息验签的应用。

    MAC(Message Authentication Code):消息认证码

            MAC算法不同于以上3种信息摘要算法;MAC算法是带密钥的Hash函数:消息的散列值由只有通信双方才知道的秘密密钥K来控制。此时Hash值称作MAC。表达公式如下所示,其中M表示信息原文,P表示MAC算法,MAC表示输出的MAC值,K表示MAC密钥:

    •  P(M with any length) by K = MAC(with fixed length)

           通过公式我们可以发现,计算MAC通常会有KEY的参与,那么在信息安全通讯领域,接收方要想验证收到的数据是否正确,就需要利用以上公式,输入MAC密钥重新计算一遍MAC值,然后对比计算值和收到的MAC值;若相等才认为数据是合法。这里涉及到一个MAC KEY,发送方和接收方对相同的数据进行MAC运算,能得到相同MAC值的前提,除了两者需使用相同的MAC算法外,还需要保证两者的MAC KEY是一致的(通常计算MAC采用的是对称加密算法)。至于,在实际生产应用过程中,如何保证两者的MAC KEY是一致的,或者说MAC KEY是如果从一方传递到另一方的,这又是另一个话题,这种应用场景,在POS机与银行后台信息交互的安全性,就是利用MAC KEY的。

            MAC算法是一个统称,它很多种实现,在POS行业,常用的MAC算法有CUP模式、EMV2000模式、或者自定义形式的MAC算法。MAC算法的核心是如何将输入数据分组,利用MAC KEY做一些XOR、移位、加密等操作,使得输入数据散列化,最后再利用MAC KEY执行加密操作(通常为对称加密)得到MAC值。

           值得注意的是,虽然MAC算法有MAC KEY的参与,但是它计算过程依然是单向的,不可逆的,这也是为什么会把它归为【信息摘要算法】的主要原因。

    常见信息摘要算法的对比
    信息摘要算法信息输入长度摘要输出长度密钥安全性
    MD5*128bits(16字节)低,有被碰撞的可能性
    SHA1*160bits(20字节)低,有被碰撞的可能性
    SHA224*224bits(28字节)较高
    SHA256*256bits(32字节)高,推荐使用,最长使用
    SHA384*384bits(48字节)高,推荐使用
    SHA512*512bits(64字节)高,高安全性场景下推荐使用
    SM3*256bits(32字节)高,推荐使用
    MAC算法*

    视不同的MAC算法而不同

    有的是8字节,有的是16字节

    高,除非密钥被破解
    注:表中*表示输入长度为“任意值”;此处的任意值,通常也是有限制的,比如SHA256,*应小于2的64次方,而SHA512,*应小于2的128次方。

    信息摘要算法的应用场景


    信息摘要算法的应用场景只要有以下几种:

    • 网络文件下载

            前面也简单提到了,在网络文件下载的时候,通常会有附上对应下载文件的摘要值,常用的是MD5或SHA1值;这个主要目的是给下载者在下载完网络文件后,做最后的文件正确性和完整性的确认。如果计算出来的摘要值,与网站上的摘要不相等,我们应认为下载的文件是不可信任的,应当做删除处理。

    • 数字签名和信息验签

           在产生数学签名的过程中,通常会有一步是对输入数据原文做摘要运算,这样做的主要目的是将输入数据原文迷你化。由于经摘要算法处理后,信息摘要的长度都是一定的,所以在做签名运算的时候,只需要对信息摘要做签名运算,在一定程度上就是输入信息的原文做签名运算。输入数据签名后,发送方会将签名数据附在输入信息的尾部,一同发送给接收方。而在验签流程中,接收方收到发送方的信息原文和签名值,首先需要做的是根据双方协商的信息摘要算法,做同样的摘要运算,得到摘要值M',然后使用密钥对签名数据进行解密运算,得到发送方的摘要M;如果M' = M,则表示验签通过,接收的数据是可任性的。

           关于数字签名的具体细节,后续会有更为详细的文章做更进一步的介绍,比如常见的签名算法是怎么工作的,等等。

    • 安全报文传输

           这种应用场景,主要是MAC算法的应用,最常见的就是POS与银行后台的报文传输。由于涉及到金融风险,所以在POS机与银联后台通讯的过程中,除了对个人账户的敏感信息(如卡号、卡密码)等做加密处理外,还需要对整一个通讯报文做MAC计算,在发送报文的时候,MAC值附在原始的密文后面以供接收方对接收的密文做MAC校验。至于为何要这样做,就是为了保证通讯报文的其他信息要素不能被篡改,比如消费的金额。试想下,如果你在超市消费了1.00元,但是由于报文被截取了,攻击者将报文中的消费金额篡改为100.00元;这种情况下,除非报文攻击者拿到了POS与银行后台通讯的MAC KEY,否则它计算出来的MAC值必定与银行后台计算的MAC值对不上,进而被银行后台当做非法报文,做丢弃处理。但如果银行后台没有MAC值校验这一步操作,那么对于消费者而言,就是明明消费了1.00元却被扣款100.00元;这个后果将变得不堪设想。


            本文对常见的信息摘要算法进行一番总结,阅读了本文后,相信读者对信息摘要算法都有了更为清晰的认识,同时对各个摘要算法之间的区别也有一定的了解。文中提及的观点,难免有纰漏之处,还望有心的读者诚心提出改进意见,互相学习,互相进步。感谢。

    展开全文
  • 消息摘要算法

    千次阅读 2019-04-11 20:37:47
    定义: 消息摘要算法又称为散列算法,其核心在于散列函数的...消息摘要算法主要分为三大类:MD(Message Digest,消息摘要算法)、SHA(Secure Hash Algorithm,安全散列算法)和MAC(Message Authentication Code,消息认...

    定义:

    消息摘要算法又称为散列算法,其核心在于散列函数的单向性。即通过散列函数可获得对应的散列值,但不可通过该散列值反推其原始数据信息,这是消息摘要算法的安全性的根本所在。

    分类:

    消息摘要算法主要分为三大类:MD(Message Digest,消息摘要算法)、SHA(Secure Hash Algorithm,安全散列算法)和MAC(Message Authentication Code,消息认证码算法)

    其他:RipeMD系列、Tiger、GOST3411和Whirlpool算法

    MD算法系列

    原理:

    1. 根据一个随机长度的信息产生一个128位的信息摘要
    2. 将128位的二进制摘要信息换算成十六进制,可以得到一个32位都是十六进制的字符串。

    分类:

    MD2,MD4,MD5三种,其中java6提供了MD2和MD5的实现,Commons Codec对java6的MD5算法进行了封装(DigestUtils支持更多形式的参数),MD4由Bouncy Castle提供。

    MessageDigest代码实例:

    //明文信息
    byte[] input = "sha".getBytes();
    //获取MessageDigest对象,使用MD5算法
    MessageDigest messageDegist = MessageDigest.getInstance("md5");
    //更新摘要信息
    messageDegist.update(input);
    //获取消息摘要结果
    byte[] output = messageDegist.digest();
    //打印出数据
    System.out.println(new BigInteger(output));
    
    //打印结果 36899609604734332497826750572321138456

    DigestInputStream代码实例

    //等待做消息摘要的原始信息
    byte[] input = "md5".getBytes();
    MessageDigest messageDigest = MessageDigest.getInstance("md5");
    DigestInputStream dis = new DigestInputStream(new ByteArrayInputStream(input),messageDigest);
    try {
        dis.read(input,0,input.length);
        byte[] disgest = dis.getMessageDigest().digest();
        System.out.println(new BigInteger(disgest));
    } catch (Exception e) {
        e.printStackTrace();
    }finally {
        try {
            dis.close();
        } catch (IOException e) {
               e.printStackTrace();
        }
    }
    //打印结果 36899609604734332497826750572321138456

    DigestOutputStream代码实例

    byte[] bytes = "md2".getBytes();
    MessageDigest messageDigest = MessageDigest.getInstance("md2");
    try (DigestOutputStream dos = new DigestOutputStream(new ByteArrayOutputStream(),messageDigest)){
        dos.write(bytes,0,bytes.length);
        byte[] output = dos.getMessageDigest().digest();
        System.out.println(new BigInteger(output));
    } catch (Exception e) {
        e.printStackTrace();
    }
    //打印结果 -145043877083066438171874784815250627066

    SHA系列

    SHA算法是在MD4算法的基础上演进而来的,通过SHA算法同样能够获得一个固定长度的摘要信息。与MD系列不同的是:若输入的消息不同,则与其相对应的摘要信息的差异概率很高。

    安全定义:

    1. 由消息摘要反推原输入信息,从计算理论上来说是很困难的。
    2. 想要找到两组不同的消息对应到相同的消息摘要从计算理论上是很困难的。任何对输入消息的变动,都有很高的机率导致其产生迥异的消息摘要。

    其实现规则和MD类似,可以参考上面的实规则。

    MAC系列

    MAC算法结合了MD5和SHA算法的优势,并加入密钥的支持,是一种更为安全的消息摘要算法。因此,我们也常把MAC称为HMAC(keyed-Hash Message Authentication Code)。MD系列的有:HmacMD2、HmacMD4和HmacMD5;SHA系列有:HmacSHA1、HmacSHA224、HmacSHA256、HmacSHA384和HmacSHA512。

    
    //加密工具类
    import org.bouncycastle.jce.provider.BouncyCastleProvider;
    import org.bouncycastle.util.encoders.Hex;
    
    import javax.crypto.KeyGenerator;
    import javax.crypto.Mac;
    import javax.crypto.SecretKey;
    import javax.crypto.spec.SecretKeySpec;
    import java.security.Security;
    
    public class MacCoder {
    
        /**
         * 初始化HmacMD2的密钥
         * @return 秘密密钥
         * @throws Exception
         */
        public static byte[] initHmacMD2Key() throws Exception {
            return initHmacKey("HmacMD2");
        }
    
        /**
         * encodeHmacMD2消息摘要
         * @param data
         * @param key
         * @return
         * @throws Exception
         */
        public static byte[] encodeHmacMD2(byte[] data,byte[] key) throws Exception {
            return encodeHmac(data,key,"HmacMD2");
        }
    
        /**
         * HmacMD2Hex消息摘要
         * @param data
         * @param key
         * @return
         * @throws Exception
         */
        public static String encodeHmacMD2Hex(byte[] data,byte[] key) throws Exception {
            return encodeHmacHex(data,key,"HmacMD2");
        }
    
        /**
         * HmacMD4密钥生成
         * @return
         * @throws Exception
         */
       public static byte[] initHmacMD4Key() throws Exception {
            return initHmacKey("HmacMD4");
       }
    
        /**
         * HmacMD4消息摘要
         * @param data
         * @param key
         * @return
         * @throws Exception
         */
       public static byte[] encodeHmacMD4(byte[] data,byte[] key) throws Exception{
           return encodeHmac(data,key,"HmacMD4");
       }
    
        /**
         * encodeHmacMD4Hex消息摘要
         * @param data
         * @param key
         * @return
         * @throws Exception
         */
       public static String encodeHmacMD4Hex(byte[] data,byte[] key) throws Exception {
          return encodeHmacHex(data,key,"HmacMD4");
       }
    
        /**
         * 生成指定的密钥对象
         * @param algorithm
         * @return
         * @throws Exception
         */
       public static byte[] initHmacKey(String algorithm) throws Exception {
           //提供BouncyCastleProvider支持
           Security.addProvider(new BouncyCastleProvider());
           //创建密钥生成对象
           KeyGenerator keyGenerator = KeyGenerator.getInstance(algorithm);
           //生成私密密钥
           SecretKey secretKey = keyGenerator.generateKey();
           //生成密钥
           return secretKey.getEncoded();
       }
    
        /**
         * 进行指定算法的摘要处理
         * @param data 代加密数据
         * @param key 密钥
         * @param algorithm 方法参数
         * @return
         * @throws Exception
         */
       public static byte[] encodeHmac(byte[] data,byte[] key,String algorithm) throws Exception {
           //添加支持
           Security.addProvider(new BouncyCastleProvider());
           //还原密钥对象
           SecretKey secretKey = new SecretKeySpec(key,algorithm);
           //实例化Mac
           Mac mac = Mac.getInstance(secretKey.getAlgorithm());
           //初始化
           mac.init(secretKey);
           //消息摘要
           return mac.doFinal(data);
       }
    
        /**
         * 返回十六进制的字符串表示
         * @param data
         * @param key
         * @param algorithm
         * @return
         * @throws Exception
         */
       public static String encodeHmacHex(byte[] data,byte[] key,String algorithm) throws Exception {
           byte[] bytes = encodeHmac(data, key, algorithm);
           return Hex.toHexString(bytes);
       }
    }
    
    //加密测试
    @Test
    public void test(){
        try {
            byte[] key = MacCoder.initHmacMD2Key();
            byte[] data = "到底真的假的".getBytes("utf-8");
            System.out.println("HmacMD2:"+MacCoder.encodeHmacMD2Hex(data,key));
            byte[] key1 = MacCoder.initHmacMD4Key();
            System.out.println("HmacMD4:"+MacCoder.encodeHmacMD4Hex(data,key1));
            byte[] key2 = MacCoder.initHmacKey("HmacSHA224");
            System.out.println("HmacSHA224:"+MacCoder.encodeHmacHex(data,key2,"HmacSHA224"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    //打印结果
    HmacMD2:90790be26d3a834f6fb1000ed93ad30e
    HmacMD4:79ea3c69b9d8b25398e5f06e0d2d3bc4
    HmacSHA224:65ec6091fbb409242ab10440ce00785e957625bd61575af109fa8ac3

    其他消息摘要算法

    RipeMD、Tiger(最快的Hash算法192位)、WhirlPool(采用了AES加密标准,最安全的摘要算法)、GOST3411(256位)

    Security.addProvider(new BouncyCastleProvider());
    MessageDigest md = MessageDigest.getInstance("RipeMD160");
    byte[] b = md.digest("开心".getBytes("utf-8"));
    展开全文
  • JAVA摘要算法

    千次阅读 2017-12-09 09:10:58
    数据摘要算法是密码学算法中非常重要的一个分支,它通过对所有数据提取指纹信息以实现数据签名、数据完整性校验等功能,由于其不可逆性,有时候会被用做敏感信息的加密。数据摘要算法也被称为哈希(Hash)算法、散列...

      数据摘要算法是密码学算法中非常重要的一个分支,它通过对所有数据提取指纹信息以实现数据签名、数据完整性校验等功能,由于其不可逆性,有时候会被用做敏感信息的加密。数据摘要算法也被称为哈希(Hash)算法、散列算法。今天,我们就开始java中摘要算法的学习。

     

    项目结构如下:

     

    SHA算法

      安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准(Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。该算法经过加密专家多年来的发展和改进已日益完善,并被广泛使用。该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。散列函数值可以说是对明文的一种“指纹”或是“摘要”所以对散列值的数字签名就可以视为对此明文的数字签名。

    一、 HuhxSHA.java

    复制代码

    package com.huhx.md;
    
    import java.security.MessageDigest;
    
    import org.apache.commons.codec.binary.Hex;
    import org.apache.commons.codec.digest.DigestUtils;
    import org.bouncycastle.crypto.Digest;
    import org.bouncycastle.crypto.digests.SHA1Digest;
    import org.junit.Test;
    
    /**
     * wirter: huhx
     */
    public class HuhxSHA {
        private static String src = "http://www.cnblogs.com/huhx";
    
        // jdk版本的sha算法
        @Test
        public void jdkSHA1() {
            try {
                MessageDigest messageDigest = MessageDigest.getInstance("SHA");
                messageDigest.update(src.getBytes());
                byte[] shaBytes = messageDigest.digest();
                System.out.println("jdk SHA 1: " + Hex.encodeHexString(shaBytes));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        
        // commons-codec的sha算法
        @Test
        public void bcSHA1() {
            Digest digest = new SHA1Digest();
            digest.update(src.getBytes(), 0, src.length());
            
            byte[] shaBytes = new byte[digest.getDigestSize()];
            digest.doFinal(shaBytes, 0);
            System.out.println("bc SHA 1: " + org.bouncycastle.util.encoders.Hex.toHexString(shaBytes));
        }
        
        // bcprov的sha算法
        @Test
        public void ccSHA1() {
            System.out.println("cc SHA 1: " + DigestUtils.sha1Hex(src.getBytes()));
        }
    }

    复制代码

    二、 运行结果如下:

    jdk SHA 1: 14ed5f04b940042df8dfcd5e60dc331dfddac16f
    bc SHA 1: 14ed5f04b940042df8dfcd5e60dc331dfddac16f
    cc SHA 1: 14ed5f04b940042df8dfcd5e60dc331dfddac16f

     

    MD算法

    MD2
      Rivest在1989年开发出MD2算法。在这个算法中,首先对信息进行数据补位,使信息的字节长度是16的倍数。然后,以一个16位的检验和追加到信息末尾,并且根据这个新产生的信息计算出散列值。后来,Rogier和Chauvaud发现如果忽略了检验将和MD2产生冲突。MD2算法加密后结果是唯一的(即不同信息加密后的结果不同)。

    MD4
      为了加强算法的安全性,Rivest在1990年又开发出MD4算法。MD4算法同样需要填补信息以确保信息的比特位长度减去448后能被512整除(信息比特位长度mod 512 = 448)。然后,一个以64位二进制表示的信息的最初长度被添加进来。信息被处理成512位damg?rd/merkle迭代结构的区块,而且每个区块要通过三个不同步骤的处理。Den boer和Bosselaers以及其他人很快的发现了攻击MD4版本中第一步和第三步的漏洞。Dobbertin向大家演示了如何利用一部普通的个人电脑在几分钟内找到MD4完整版本中的冲突(这个冲突实际上是一种漏洞,它将导致对不同的内容进行加密却可能得到相同的加密后结果)。毫无疑问,MD4就此被淘汰掉了。尽管MD4算法在安全上有个这么大的漏洞,但它对在其后才被开发出来的好几种信息安全加密算法的出现却有着不可忽视的引导作用。

    MD5
      1991年,Rivest开发出技术上更为趋近成熟的md5算法。它在MD4的基础上增加了"安全-带子"(safety-belts)的概念。虽然MD5比MD4复杂度大一些,但却更为安全。这个算法很明显的由四个和MD4设计有少许不同的步骤组成。在MD5算法中,信息-摘要的大小和填充的必要条件与MD4完全相同。Den boer和Bosselaers曾发现MD5算法中的假冲突(pseudo-collisions),但除此之外就没有其他被发现的加密后结果了。

    一、 HuhxMD.java

    复制代码

    package com.huhx.md;
    
    import java.security.MessageDigest;
    import java.security.Security;
    
    import org.apache.commons.codec.digest.DigestUtils;
    import org.bouncycastle.crypto.Digest;
    import org.bouncycastle.crypto.digests.MD5Digest;
    import org.bouncycastle.jce.provider.BouncyCastleProvider;
    import org.bouncycastle.util.encoders.Hex;
    import org.junit.Test;
    
    public class HuhxMD {
        private static String src = "http://www.cnblogs.com/huhx";
    
        @Test
        public void jdkMD5() {
            try {
                MessageDigest messageDigest = MessageDigest.getInstance("MD5");
                byte[] mdBytes = messageDigest.digest(src.getBytes());
                System.out.println("md5 decode: " + Hex.toHexString(mdBytes));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        @Test
        public void jdkMD2() {
            try {
                MessageDigest messageDigest = MessageDigest.getInstance("MD2");
                byte[] mdBytes = messageDigest.digest(src.getBytes());
                System.out.println("md2 decode: " + Hex.toHexString(mdBytes));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        @Test
        public void bcmMD4() {
            // Digest digest = new MD4Digest();
            // digest.update(src.getBytes(), 0, src.length());
            // byte[] mdBytes = new byte[digest.getDigestSize()];
            // digest.doFinal(mdBytes, 0);
            // System.out.println("md4 decode: " + Hex.toHexString(mdBytes));
    
            Security.addProvider(new BouncyCastleProvider());
            try {
                MessageDigest messageDigest = MessageDigest.getInstance("MD4");
                byte[] mdBytes = messageDigest.digest(src.getBytes());
                System.out.println("md4 decode: " + Hex.toHexString(mdBytes));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        //
        @Test
        public void bcmMD5() {
            Digest digest = new MD5Digest();
            digest.update(src.getBytes(), 0, src.length());
            byte[] mdBytes = new byte[digest.getDigestSize()];
            digest.doFinal(mdBytes, 0);
            System.out.println("md5 decode: " + Hex.toHexString(mdBytes));
        }
    
        //
        @Test
        public void ccMD5() {
            String md5String = DigestUtils.md5Hex(src.getBytes());
            System.out.println("common md5: " + md5String);
        }
    }

    复制代码

    二、 运行结果如下:

    md4 decode: b402321e9a067da3df0c36c8315f8e38
    md5 decode: f121bf5f7491466ae75e056f686c4462
    md2 decode: 42b6b066b1273470f9aad644cede7644
    md5 decode: f121bf5f7491466ae75e056f686c4462
    common md5: f121bf5f7491466ae75e056f686c4462

     由于md5的算法被发现了某些微妙的规律性。所以建议最好使用ShA1的算法。

     

    MAC算法

    MAC算法 (Message Authentication Codes) 带秘密密钥的Hash函数:消息的散列值由只有通信双方知道的秘密密钥K来控制。此时Hash值称作MAC。

    MAC算法原理(以直联银联pos和POS中心通讯为例)。

    • 将欲发送给POS中心的消息中,从消息类型(MTI)到63域之间的部分构成MAC ELEMEMENT BLOCK (MAB)。
    •  对MAB,按每8个字节做异或(不管信息中的字符格式),如果最后不满8个字节,则添加“0X00”。

    一、 HuhxMAC.java

    复制代码

    package com.huhx.md;
    
    import javax.crypto.KeyGenerator;
    import javax.crypto.Mac;
    import javax.crypto.SecretKey;
    import javax.crypto.spec.SecretKeySpec;
    
    import org.bouncycastle.crypto.digests.MD5Digest;
    import org.bouncycastle.crypto.macs.HMac;
    import org.bouncycastle.crypto.params.KeyParameter;
    import org.bouncycastle.util.encoders.Hex;
    import org.junit.Test;
    
    public class HuhxMAC {
    
        private static String src = "http://www.cnblogs.com/huhx";
        private static String decodeKey = "bbbbbbbbbb";
    
        @Test
        public void jdkHmacMD5() {
            try {
                // 初始化KeyGenerator
                KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacMD5");
                // 产生密钥
                SecretKey secretKey = keyGenerator.generateKey();
                // 获得密钥
                // byte[] keyBytes = secretKey.getEncoded();
                byte[] keyBytes = org.apache.commons.codec.binary.Hex.decodeHex(decodeKey.toCharArray());
                // 还原密钥
                SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, "HmacMD5");
                // 实例化MAC
                Mac mac = Mac.getInstance(secretKeySpec.getAlgorithm());
                // 初始化Mac
                mac.init(secretKeySpec);
                // 执行摘要
                byte[] result = mac.doFinal(src.getBytes());
                System.out.println("jdk mac: " + Hex.toHexString(result));
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    
        @Test
        public void bcHmacMD5() {
            HMac hMac = new HMac(new MD5Digest());
            hMac.init(new KeyParameter(Hex.decode(decodeKey)));
            hMac.update(src.getBytes(), 0, src.length());
    
            byte[] hMacBytes = new byte[hMac.getMacSize()];
            hMac.doFinal(hMacBytes, 0);
            System.out.println("bc mac: " + Hex.toHexString(hMacBytes));
        }
    }

    复制代码

    二、 运行结果如下:

    bc mac: 3bf59d550b1e0d6cee15e015870029f9
    jdk mac: 3bf59d550b1e0d6cee15e015870029f9

     

    友情链接

     

    作者: huhx 
    出处: www.cnblogs.com/huhx

     

    展开全文
  • 信息摘要算法

    2015-05-30 14:39:03
    用于网络安全的信息摘要算法,SHA信息摘要算法
  • 摘要算法

    千次阅读 2017-04-12 10:18:58
    摘要算法是一种能产生特殊输出格式的算法,这种算法的特点是:无论用户输入多少长度的原始数据,经过计算后输出的密文都是固定长度的,这种算法的原理是根据一定的运算规则对原数据进行某种形式的提取,这种提取就是...
           摘要算法是一种能产生特殊输出格式的算法,这种算法的特点是:无论用户输入多少长度的原始数据,经过计算后输出的密文都是固定长度的,这种算法的原理是根据一定的运算规则对原数据进行某种形式的提取,这种提取就是摘要,被摘要的数据内容与原数据有密切联系,只要原数据稍有改变,输出的“摘要”便完全不同,因此,基于这种原理的算法便能对数据完整性提供较为健全的保障。但是,由于输出的密文是提取原数据经过处理的定长值,所以它已经不能还原为原数据,即消息摘要算法是不可逆的,理论上无法通过反向运算取得原数据内容,因此它通常只能被用来做数据完整性验证。
            如今常用的“消息摘要”算法经历了多年验证发展而保留下来的算法已经不多,这其中包括MD2、MD4、MD5、SHA、SHA-1/256/384/512等。
            常用的摘要算法主要有MD5和SHA1。D5的输出结果为16字节(128位),SHA1的输出结果为20字节(160位)。
             MD5算法: 
            对MD5算法简要的叙述可以为:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。     
    1、首先需要对信息进行填充,使其字节长度对512求余的结果等于448。因此,信息的字节长度(Bits Length)将被扩展至(L-1)*512+448,即(L-1)*64+56个字节(Bytes)。填充的方法如下,在信息的后面填充一个1和无数个0,直到满足上面的条件时才停止用0对信息的填充。
    2、然后在这个结果后面附加一个以64位二进制表示的填充前信息长度。经过这两步的处理,现在的信息字节长度=(L-1)*512+448+64=L*512,即长度恰好是512的整数倍。这样做的原因是为满足后面处理中对信息长度的要求。     
    3、MD5中有4个32位被称作链接变量(Chaining Variable)的整数参数,它们分别为:A=0x01234567,B=0x89abcdef,C=0xfedcba98,D=0x76543210。  它们连接起来作为IV。     
    4、当设置好这四个链接变量后,HMD5开始进入算法的四轮循环运算。
    5、循环的次数是信息中512位信息分组的数目,即L次循环。
             SHA-1算法:
    1、首先需要对信息进行填充,使其字节长度对512求余的结果等于448。因此,信息的字节长度(Bits Length)将被扩展至N*512+448,即N*64+56个字节(Bytes),N为一个正整数。填充的方法如下,在信息的后面填充一个1和无数个0,直到满足上面的条件时才停止用0对信息的填充。 
    2、附加消息长度,与MD5第二步类似,不同的是以大端(最高有效字节/位存储于低地 址字节/位)方式来表示消息被填充前的长度。  
    3、对消息摘要缓冲区初始化,算法使用160比特长的缓冲区来存储中间结果和最终散列值,将缓冲区表示成5个32比特长的寄存器A、B、C、D、E,每个寄存器以大端方式存储数据,初始值为(十六进制,高位字节在前)A=67452301,B=EFCDAB89,C=98BADCFE,D=10325476,E=C3D2E1F0。  
    4、以分组为单位对消息进行处理,每一个分组都经过压缩函数HSHA处理;HSHA有4轮处理过程,每一轮又有20步迭代;4轮处理过程的处理结构一样,所用逻辑函数不同,分别表示为f1、f2、f3、f4;每轮的输入为当前处理的消息分组和缓冲区当前的值,输出仍存放在缓冲区中。最后第四轮的输出与第一轮输入的缓冲区值V相加,相加时将V看做5个32比特的字,每个字与第四轮输出的对应的字按模232相加,相加结果为HMD5的输出。
    5、消息的所有分组均被处理完后,最后一个HSHA的输出即为产生的160位消息摘要。

     
    • 大小: 54.9 KB
    • 大小: 8.8 KB
    展开全文
  • 3. 加密算法与消息摘要算法.txt
  • 搜索引擎摘要的选取原则、算法规则一直没有明确的框架或算法,以形成用户查询为中心的动态摘要为出发点,给出了动态摘要算法实现的形式化原则,并具体实现了一种动态摘要算法.与百度搜索引擎的动态摘要相比较,实验结果...
  • Python摘要算法

    千次阅读 2017-11-07 11:50:32
    Python的hashlib提供了常见摘要算法,如MD5,SHA1等等直接上代码:#coding=utf-8 import hashlib file = open('./linux.zip') data = file.read() #获取文件内容 print type(data) #print data #打印出的...
  • 包含Base64 ...包含摘要算法:MD2,MD4,MD5,SHA1,SHA2(SHA-224,SHA-256,SHA-384,SHA-512) 数字签名算法:RSA,DSA,ECDSA 详情请查看:http://blog.csdn.net/baidu_34012226/article/details/53331147
  • 数据摘要算法

    2018-04-23 23:12:30
    在看MD5加密时, MessageDigest md = MessageDigest.getInstance(“MD5”); 对algorithm摘要算法的标准名称产生了疑惑。...概述 数据摘要算法具有不可逆性, 其主要功能有数据... 下面介绍常见的数据摘要算法:CRCCRC(C
  • 一、加密算法 1.1加密和解密 1.1.1加密 数据加密的基本过程,就是对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段代码,通常称为“密文”。通过这样的途径,来达到 保护数据 不被 非法人窃取...
  • 主要介绍了MAC算法之消息摘要算法HmacMD5的实现的相关资料,这里提供实例,帮助大家学习理解这部分知识,需要的朋友可以参考下
  • 算法设计摘要

    2018-05-08 22:48:28
    算法设计摘要算法设计摘要算法设计摘要算法设计摘要算法设计摘要算法设计摘要
  • java消息摘要算法加密

    千次阅读 2017-05-23 17:58:04
    参考:Java加密算法消息摘要算法加密 消息摘要算法MD MD算法的应用 消息摘要算法SHA SHA算法的应用 消息摘要算法MAC消息摘要算法加密  消息摘要算法主要分为3类:MD(Message Digest)、SHA(Secure Hash ...
  • 包含消息摘要算法和对称加密算法的代码及应用总结
  • MD5摘要算法

    千次阅读 2016-01-08 16:12:11
    MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值...
  • 最新消息摘要算法

    2014-06-08 10:08:11
    NIST选出的最新消息摘要算法,用于提到SHA1和SHA2.
  • MD5 摘要算法应用详解

    千次阅读 2020-06-23 23:37:32
      MD5是典型的消息摘要算法,是广泛使用的消息摘要算法之一,更是消息摘要算法首要代表。其前身包括MD2、MD4。MD算法家族针对源数据会产生一个128位的消息摘要。在一般应用场景下,会将128二进制摘要信息转换为...
  • 1. 对称算法 ...2. 摘要算法 消息摘要算法是不可逆。 常用的“消息摘要”算法有: MD2、MD4、MD5、SHA、SHA-1/256/383/512等。  常用的摘要算法主要有MD5和SHA1。MD5的输出结果为16字节,sha1的输出结
  • 常用的消息摘要算法

    千次阅读 2017-08-24 10:18:23
    常用的消息摘要算法
  • 常见加密算法常见加密算法原理

    万次阅读 2018-08-09 17:16:11
    加密算法和协议 ...常见算法: - DES:Data Encryption Standard; - 3DES:Triple DES; - AES:Advanced Encryption Standard; (128bits, 192bits, 256bits, 384bits) - Blowfish - Twofish ...
  • MD5 摘要算法的C语言实现,从 RFC1321 中摘出来的算法实现
  • 本篇文章主要介绍了Java实现MD5消息摘要算法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 三分钟读懂摘要算法

    千次阅读 2018-06-01 15:47:53
    摘要算法又称哈希算法,它表示输入任意长度的数据,输出固定长度的数据,相同的输入数据始终得到相同的输出,不同的输入数据尽量得到不同的输出。 Java中的Object.hashCode()方法就是一个摘要算法,它可以输入任意...
  • 消息摘要算法简介

    千次阅读 2016-10-29 10:51:48
    什么是消息摘要算法 消息摘要算法的主要特征是加密过程不需要密钥,并且经过加密的数据无法被解密,只有输入相同的明文数据经过相同的消息摘要算法才能得到相同的密文。消息摘要算法不存在密钥的管理与分发问题,...
  • java中常用的摘要算法

    千次阅读 2018-01-15 18:11:15
    java中的摘要算法和使用

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 133,091
精华内容 53,236
关键字:

常见的摘要算法