风也温柔

计算机科学知识库

java md5密钥加密解密 Java加密与解密之消息摘要算法1

  消息摘要算法有3大类,分别是:MD、SHA、MAC,通常用于数据完整性的验证。

  MD: 消息摘要算法。包括:MD2,MD4,MD5 3种算法。

  SHA: Hash 安全散列算法。包括:SHA-1和SHA-2系列,包含了SHA-224,SHA-256,SHA-384,SHA-512。

  Hmac: Code消息认证码算法。包含:,,,,。

  消息摘要算法也可称为散列算法,它的核心就是散列函数,通过散列函数获取一串散列值,由于散列函数是单向的,所以不能通过得到的散列值还原原始值信息。我们一般通过这类算法来加密我们的密码,比如用户在我们的web页面注册后,我们会把用户设置的密码通过md5或者sha来加密。

  环境:JDK1.8

  代码示例:

   public class MD5Demo {

        
        private static final String ALGORITHM = "md5" ;
        /**
         *    <p>
         *     MD5消息摘要算法
         *  

         *    2020年10月8日 下午1:33:18
         *    @author xg
         *    @param source 需要处理的源数据
         *    @return byte[]  消息摘要结果
         *    @throws Exception
         */
        public static byte[] encodeMD5(byte[] source) throws Exception {
            // 初始化MessageDigest
            MessageDigest md = MessageDigest.getInstance(ALGORITHM) ;
            // 执行消息摘要
            return md.digest(source) ;
        }
        /**
    &emsp;&emsp;![java md5密钥加密解密_md5加密和解密算法_android md5加密 解密][1]

         *    &emsp;&emsp;
         *     将字节数组转成16进制(这里大家可以用第三方的工具转换,我这里懒得引包了)
         *  

         *    2020年10月8日 下午1:36:15
         *    @author xg
         *    @param digest 摘要数据
         *    @return String 16进制数据
         */
        public static String hex(byte[] digest) {
            StringBuilder sb = new StringBuilder() ;
            for (byte b : digest) {
                String str = Integer.toHexString(b & 0xff) ;
                if (str.length() < 2) {
                    sb.append("0" + str) ;
                } else {
                    sb.append(str) ;
                }
            }
            return sb.toString() ;
        }
        
        public static void main(String[] args) throws Exception {
            byte[] source = "我是MD5消息摘要算法".getBytes() ;
            String md5 = hex(encodeMD5(source)) ;
            System.out.println(md5) ;
        }
    &emsp;&emsp;![md5加密和解密算法_android md5加密 解密_java md5密钥加密解密][2]

</p>
  代码很简单其实就是两步就完成了。

  1、初始化

  2、执行消息摘要

  在工作中我们一般不会这么简单的使用我们会对要生成的摘要数据进行加盐处理

  比如这里我们的进行摘要的数据是:

   s = "我是MD5消息摘要算法" ;

  加入我们系统中有身份证号码字段也或者是用户名字段(切记一定要唯一哦不可变的),那我们可以把这个s字符串和身份证号码字段拼接在一起后再执行MD5消息摘要

  身份证:

   byte[] source = "我是MD5消息摘要算法xxxxxxxxxxxxxxxx914".getBytes() ;

    String md5 = hex(encodeMD5(source)) ;

  第三方的实现有:

   (BC)、 Codec

  JDK自身支持的算法不多一般来说是够用了java md5密钥加密解密,BC这个支持的算法比较多。比如MD4算法JDK不支持java md5密钥加密解密,如果你要是用MD4那只能使用BC了。

  如何使用BC?

  很简单只需要加入BC的包,然后再代码中加入一行代码即可。

   public static byte[] encodeMD5(byte[] source) throws Exception {

            Security.addProvider(new BouncyCastleProvider()) ;
            // 初始化MessageDigest
            MessageDigest md = MessageDigest.getInstance(ALGORITHM) ;
            // 执行消息摘要
            return md.digest(source) ;

  注意这里的:.(new ()) ;

  SHA算法

  SHA算法是基于MD4算法实现的,SHA于MD不同之处主要就是摘要的长度不同,SHA长度比MD要长也就是安全性更高。

  SHA算法的发展:

  SHA-0:由NIST公布的第一个版本FIPS PUB 180,该算法由于存在降低密码安全性的错误而导致未推出就夭折。

  SHA-1:由NIST发布的第二个版本FIPS PUB 180-1,简称为:SHA-1。

  SHA-2:由NIST发布包含有:SHA-224,SHA-256,SHA-384,SHA-512,这里的数字是表示了摘要信息字节长度。

  代码示例(这里可以直接使用前面的例子即可,修改下对应的算法即可):

   package com.pack.security.sha;

    import java.security.MessageDigest;
    import java.security.Security;
    import org.bouncycastle.jce.provider.BouncyCastleProvider;
    public class SHADemo {
        
        private static final String ALGORITHM = "SHA" ;
        /**
         *    <p>
         *     SHA消息摘要算法
         *  

         *    2020年10月8日 下午1:33:18
         *    @author xg
         *    @param source 需要处理的源数据
    &emsp;&emsp;![android md5加密 解密_java md5密钥加密解密_md5加密和解密算法][3]

         *    @return byte[]  消息摘要结果
         *    @throws Exception
         */
        public static byte[] encodeMD5(byte[] source) throws Exception {
            Security.addProvider(new BouncyCastleProvider()) ;
            // 初始化MessageDigest
            MessageDigest md = MessageDigest.getInstance(ALGORITHM) ;
            // 执行消息摘要
            return md.digest(source) ;
        }
        /**
         *    &emsp;&emsp;
         *     将字节数组转成16进制(这里大家可以用第三方的工具转换,我这里懒得引包了)
         *  

         *    2020年10月8日 下午1:36:15
         *    @author xg
         *    @param digest 摘要数据
         *    @return String 16进制数据
         */
        public static String hex(byte[] digest) {
            StringBuilder sb = new StringBuilder() ;
            for (byte b : digest) {
                String str = Integer.toHexString(b & 0xff) ;
                if (str.length() < 2) {
                    sb.append("0" + str) ;
                } else {
    &emsp;&emsp;![java md5密钥加密解密_android md5加密 解密_md5加密和解密算法][4]

                    sb.append(str) ;
                }
            }
            return sb.toString() ;
        }
        
        public static void main(String[] args) throws Exception {
            byte[] source = "我是SHA消息摘要算法".getBytes() ;
            String md5 = hex(encodeMD5(source)) ;
            System.out.println(md5) ;
        }

</p>
  SHA-0和SHA-1生成的摘要信息16进制是40位的字节长度是160位。

  SHA-xxx这类的是摘要长度是对应的数字长度比如:SHA-512那摘要字节长度就是512位。

  在JDK8中支持的有SHA-256,SHA-384,SHA-512;如果要是用SHA-224那你只能使用第三方的库BC了。具体使用方法上面讲MD时已经说了。

  文件校验:

  在很多网站上下载文件时我们可能都见过如下图:

  我们点击这里的 页面会输出如下内容:

  这个内容就是当前下载文件生成的摘要信息,算法使用的是

  当下载这个文件后我们也可以通过算法生成这个文件的摘要信息,然后与网站提供的这个摘要信息进行比对,如果相同证明这个文件没有被篡改,否则你下载的这个文件肯定是有问题的,很可能被植入了病毒等。

  接下来我们来看如何把下载的文件去生成摘要信息:

  完毕!!!

  MAC(Hmac)算法会在下一篇文章中介绍java md5密钥加密解密 Java加密与解密之消息摘要算法1,Hmac算法稍微比MD,SHA算法要复杂点,主要是多了个密钥。

  文章来源:http://www.toutiao.com/a6881135092593328644/