MD5加密

MD5加密

MD5加密属于hash算法,hash叫做散列信息摘要算法

特点:

		1、不可逆:无法通过摘要信息还原出原始数据 
		2、算法有很多种,但是无论哪一种hash算法,最终产⽣的都是一个固定长度的字符串  
		3、对于任何类型长度的输入数据,都有着相同长度输出  
		4、对于相同输入和相同算法,产生的结果一定相同 
		(极小概率出现,不同输入 相同算法产生相同结果)

MD5解密

撞库

原理:提前把输入数据和输出结果做一个映射关系, 撞库时就是拿着结果(key)去查数据库 只要输入数据稍微复杂撞库就失败了

加盐

数据太简单 容易易被撞库 ,解决⽅方法就是加盐,即在原数据的基础上加上一些字符串,使数据不容易被撞库(在验证时也要加相同的字符串)

作用

1、加密    需要强调的是,加密的结果是无法反解的,存储的是密文, 查的时候 使用相同的算法加密,比较加密后的结果是否相同 

2、数据校验  可以用来校验数据是否被篡改 

MD5加密实现

MessageDigest

MessageDigest 类为应用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法。信息摘要是安全的单向哈希函数,它接收任意大小的数据,输出固定长度的哈希值。

MessageDigest 对象开始被初始化。该对象通过使用 update 方法处理数据。任何时候都可以调用 reset 方法重置摘要。一旦所有需要更新的数据都已经被更新了,应该调用 digest 方法之一完成哈希计算。

对于给定数量的更新数据,digest 方法只能被调用一次。digest 被调用后,MessageDigest 对象被重新设置成其初始状态。

MD5实现

public class MD5Tool {
    //加盐生成MD5,有定义算法
    public static String getMD5(String text, String salt,String algorithm) {
        try {
           //创建一个算法对象,算法不为空则用参数算法,否则使用默认MD5算法加密
            MessageDigest instance = MessageDigest.getInstance(algorithm!=null?algorithm:"MD5");
            //以UTF-8字节的方式加入要进行加密的字符串
            instance.update(text.getBytes("UTF-8"));
            //如果salt不为空,则进行加盐
            if (salt != null) {
                instance.update(salt.getBytes("UTF-8"));
            }
            //digest方法进行哈希计算,并返回byte[]
            byte[] digests = instance.digest();
            //声明一个StringBuffer容器来储存十六进制的字符串
            StringBuilder sb = new StringBuilder();
            /*字节转16进制
            对于字节是-128 - 127 如果小于0就加256(即digest & 0xFF)再转成十六进制
        	十六进制数为4个二进制位。一个字节为8个二进制位。因此,一个字节可表示为两个十六进制数字,
        	所以,如果hex.length()小于2要补0
        	*/
            for (byte digest : digests) {
                String hex = Integer.toHexString(digest & 0xFF);
                if (hex.length() < 2) {
                    sb.append(0);
                }
                sb.append(hex);
            }
            //转字符串
            return sb.toString();
        } catch (Exception e) {//出现异常转为空
            e.printStackTrace();
            return null;
        }
    }
    //不加盐生成MD5,没有定义算法
    public static String getMD5(String text) {
        return getMD5(text,null);
    }
    //加盐生成MD5,没有定义算法
    public static String getMD5(String text,String salt) {
        return getMD5(text,salt,null);
    }
	//测试
    public static void main(String[] args) {
        System.out.println(getMD5("abc"));
        System.out.println(getMD5("abc","akjKJHKJAJKSHJKAHSJANJNJANS"));
        System.out.println(getMD5("abc","akjKJHKJAJKSHJKAHSJANJNJANS","SHA-256"));
        System.out.println(getMD5("abc",null,"SHA-512"));
    }
}

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值