java常用加密算法及MD5的使用

前言:工作中经常遇到将数据进行各种方式的加密,然后封装到一个自定义的实体类中作为参数进行传输数据。当然这是为了数据在传输过程中的安全保证,不被其他人轻易的就获取到原数据;

首先,加密解密的概念很简单明了,就是字面意思;加密就是对原来的明文的文件或数据按某种算法进行处理,成为一段不可读的代码,也称为密文;解密就是加密的反过程,将加密后不可读的代码转化成原来的数据;

除了加密解密的概念,还有就是因为加密算法有很多种,总体分为两类:对称加密非对称加密以及散列算法,对称加密就是加密和解密的使用的密钥是相同的,非对称加密中加密和解密时使用的密钥是不同的,散列算法和前面两种就不太相同,它加密是不需要密钥的;

最常见的散列算法就是MD5SHA1,简单介绍一下MD5吧,因为最近也经常用到。

MD5(信息-摘要算法5)

MD5算法是一种哈希函数,就一段信息对应一个哈希值,并且不能通过哈希值推出这段信息,而且还需要保证不存在任意两段不相同的信息对应同一个哈希值。MD5用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。

广泛用于加密和解密技术,常用于文件校验。不管文件多大,经过MD5后都能生成唯一的MD5值。好比现在的ISO校验,都是MD5校验;输入任意长度的信息,经过处理,输出都为128位的信息(数字指纹);

MD5是不可逆的,意思就是它其实没有解密方法的,只能进行加密处理;因为它在hash算法的计算过程中原文的部分信息是丢失了的

这里有篇MD5的详解如果想深入了解的可以看看这篇文章:https://blog.csdn.net/goodnameused/article/details/81068697

SHA1(安全哈希算法)

它的使用方法和md5是相同的,和MD5同样使用的使用hash函数,主要适用于数据子签名标准里面定义的数字签名算法,该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段更小的密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要)的过程。

DES算法

DES 加密算法是一种 分组密码,以 64 位为 分组对数据 加密,它的 密钥长度 是 56 位,加密解密 用 同一算法。

DES 加密算法是对 密钥 进行保密,而 公开算法,包括加密和解密算法。这样,只有掌握了和发送方 相同密钥 的人才能解读由 DES加密算法加密的密文数据。因此,破译 DES 加密算法实际上就是 搜索密钥的编码。对于 56 位长度的 密钥 来说,如果用 穷举法 来进行搜索的话,其运算次数为 2 ^ 56 次。

AES算法

AES 加密算法是密码学中的 高级加密标准,该加密算法采用 对称分组密码体制,密钥长度的最少支持为 128 位、 192 位、256 位,分组长度 128 位,算法应易于各种硬件和软件实现。这种加密算法是美国联邦政府采用的 区块加密标准。

AES 本身就是为了取代 DES 的,AES 具有更好的 安全性、效率 和 灵活性。

RSA算法

RSA 加密算法是目前最有影响力的 公钥加密算法,并且被普遍认为是目前 最优秀的公钥方案 之一。RSA 是第一个能同时用于 加密数字签名 的算法,它能够 抵抗 到目前为止已知的 所有密码攻击,已被 ISO 推荐为公钥数据加密标准。

RSA算法基于一个十分简单的数论事实:将两个大 素数 相乘十分容易,但想要对其乘积进行 因式分解 却极其困难,因此可以将 乘积 公开作为 加密密钥

更多算法介绍强烈推荐:https://blog.csdn.net/baidu_22254181/article/details/82594072

下面就直接介绍一下怎么使用吧,毕竟加密解密在工作中一般都是封装好了的,其实最开始简单了解,然后知道怎么用就可以了;

Java已经实现了MD5、SHA1算法。利用java.security.MessageDigest类就可以获取字符串和文件的MD5以及SHA1结果。

最简单的使用方法:

Tools工具类:

import org.apache.commons.codec.digest.DigestUtils;

import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class Tools {
    
    /**
     * md5简单使用实现
     * @param str
     * @return
     */
    public static String getMD5String(String str) {
        try {
            // 生成一个MD5加密计算摘要(如果想使用sha1算法,可以替换成"SHA1")
            MessageDigest md = MessageDigest.getInstance("MD5");
            // 计算md5函数
            md.update(str.getBytes());
            // digest()最后确定返回md5 hash值,返回值为8位字符串。因为md5 hash值是16位的hex值,实际上就是8位的字符
            // BigInteger函数则将8位的字符串转换成16位hex值,用字符串来表示;得到字符串形式的hash值
            //一个byte是八位二进制,也就是2位十六进制字符(2的8次方等于16的2次方)
            return new BigInteger(1, md.digest()).toString(16);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }


    /**
     * MD5算法加密 (公司使用)
     * @param source
     * @return
     */
    public static String MD5(String source) {
        System.out.println(source);
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            md.update(source.getBytes());
            byte[] b = md.digest();
            StringBuffer sb = new StringBuffer();
            for (byte c : b) {
                int val = ((int) c) & 0xff;
                if (val < 16)
                    sb.append("0");
                sb.append(Integer.toHexString(val));
            }
            return sb.toString().toUpperCase();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * MD5算法加盐 (更复杂加密方式)
     * @param source
     * @return
     */
    private static final String MD5KEY = "fadsjlfjeohkdfgjlk423211";

    /**
     * MD5验证方法
     * @param text 明文
     * @return 密文
     */
    public static String MD5encrypt(String text){
        //加密后的字符串
        String encodeStr = DigestUtils.md5Hex(text + MD5KEY);
        return encodeStr;
    }

    /**
     * MD5验证方法
     * @param text 明文
     * @param md5 密文
     * @return true/false
     */
    public static boolean verify(String text, String md5){
        //根据传入的密钥进行验证
        String md5Text = MD5encrypt(text);
        if (md5Text.equalsIgnoreCase(md5)){
            return true;
        }
        return false;
    }

}

测试类:

package com.leejie.md5Test;

import com.leejie.utils.Tools;

public class MD5Test {

    private static final String pwd = "aabbcc";

    public static void main(String[] args) throws Exception {
        //简单加密
        System.out.println(Tools.MD5(pwd));

        //复杂加密
        String md5Pwd = Tools.MD5encrypt("aabbcc");
        System.out.println("aabbcc通过密钥加密之后的密文:"+md5Pwd);
        //项目中使用md5做登录密码验证,加密的密码都是从数据库中取来,和登录输入的密码(密码在验证方法中进行相同的加密)进行对比
        //验证密码是否正确
        boolean result = Tools.verify("aabbcc", md5Pwd);
        System.out.println("验证结果:"+result);
    }
}

输出:

aabbcc
61A60170273E74A5BE90355FFE8E86AD
aabbcc通过密钥加密之后的密文:fccde86bc3bf351614d27baa5eff75ba
验证结果:true

更详细经典的文章推荐:

https://blog.csdn.net/qq_30683329/article/details/80879058

https://www.cnblogs.com/gaoqing/p/3678039.html

https://blog.csdn.net/u012611878/article/details/54000607

总结

就这样吧,主要是介绍一下md5加密的使用,在平时传输数据或者存储密码时能够会使用就好了,更复杂的非对称加密先了解,等着后面在慢慢详细学习。不早了,明天继续加油!!

下一篇:sync异步的使用

你可能感兴趣的:(java加解密,java,md5,加密解密)