Java加密的几种方式

Java常用的加密方式

1.BASE64

严格来说BASE64不算是加密,而是对其编码格式进行修改,使之变为不易被人识别的形式。在实际使用中,将密码加密并储存到数据库中,登录时取出存储的密码,进行解密

/**
 * @author Myriven
 * @date 2019/12/23 14:23
 * @description
 */
/*BASE564加密*/
public class BASE64Demo {

    public static void main(String[] args) throws IOException {
        String broforePWD="password";
        System.out.println("加密前:"+broforePWD);

        String afterPWD = encryptBASE64(broforePWD.getBytes());
        System.out.println("加密后:"+afterPWD);

        byte[] bytes = decryptBASE64(afterPWD);
        System.out.println("解密后:"+new String(bytes));
    }

    /*加密*/
    public static String encryptBASE64(byte[] pwd){
        String  result= new BASE64Encoder().encodeBuffer(pwd);
        return result;
    }
    /*解密*/
    public static byte[] decryptBASE64(String pwd) throws IOException {
        byte[] bytes = new BASE64Decoder().decodeBuffer(pwd);
        return bytes;
    }
}

2.MD5

MD5加密全程是Message-Digest Algoorithm 5(信息-摘要算法),它对信息进行摘要采集,再通过一定的位运算,最终获取加密后的MD5字符串。
MD5加密属于不可逆加密,在实际使用中,将密码加密后存储到数据库中,在登录的时候将输入的密码获取到,再次通过该加密算法加密,与数据库中存储的进行比较判断密码输入的是否正确

MD5有哪些特点
  MD5加密的特点主要有以下几点:
  1、针对不同长度待加密的数据、字符串等等,其都可以返回一个固定长度的MD5加密字符串。(通常32位的16进制字符串);
  2、其加密过程几乎不可逆,除非维护一个庞大的Key-Value数据库来进行碰撞破解,否则几乎无法解开。
  3、运算简便,且可实现方式多样,通过一定的处理方式也可以避免碰撞算法的破解。
  4、对于一个固定的字符串。数字等等,MD5加密后的字符串是固定的,也就是说不管MD5加密多少次,都是同样的结果。

java自带的MD5加密

/**
 * @author Myriven
 * @date 2019/12/23 14:50
 * @description
 */
/*md5加密*/
public class MD5Demo {
    public static void main(String[] args) throws NoSuchAlgorithmException {
        String pwd="password";
        // 生成一个MD5加密计算摘要
        MessageDigest md = MessageDigest.getInstance("MD5");
        // 计算md5函数
        md.update(pwd.getBytes());
        // digest()最后确定返回md5 hash值,返回值为8位字符串。因为md5 hash值是16位的hex值,实际上就是8位的字符
        // BigInteger函数则将8位的字符串转换成16位hex值,用字符串来表示;得到字符串形式的hash值
        //一个byte是八位二进制,也就是2位十六进制字符(2的8次方等于16的2次方)
        System.out.println("JAVA自带md5加密==========>"+ new BigInteger(1, md.digest()).toString(16));

    }
}

spring自带的工具DigestUtils实现

DigestUtils.md5DigestAsHex("password".getBytes())

3.BCrypt

原文网址: https://www.cnblogs.com/xingzc/p/8624007.html

public class BCryptDemo {
  public static void main(String[] args) {
   String newPWD= "password";
   //加密
   String newPWD= BCrypt.hashpw(newPWD, BCrypt.gensalt());
   System.out.println("加密后:"+newPWD);
   //BCrypt.gensalt(12)表示加盐,gensalt中的参数决定了他的复杂性,默认是10
   String hashed2 = BCrypt.hashpw(password, BCrypt.gensalt(12));
  
   String candidate = "testpassword";
 	//检查未加密的密码(candidate)是否与加密的密码一致,进行比较,如果相同返回true
   if (BCrypt.checkpw(candidate,newPWD)){
    System.out.println("密码相同");
   }else{
  		System.out.println("密码不同");
  	 }
  }
}

什么是加盐?

如果两个人或多个人的密码相同,加密后保存会得到相同的结果。破一个就可以破一片的密码。如果名为A的用户可以查看数据库,那么他可以观察到自己的密码和别人的密码加密后的结果都是一样,那么,别人用的和自己就是同一个密码,这样,就可以利用别人的身份登录了。
其实只要稍微混淆一下就能防范住了,这在加密术语中称为“加盐”。具体来说就是在原有材料(用户自定义密码)中加入其它成分(一般是用户自有且不变的因素),以此来增加系统复杂度。当这种盐和用户密码相结合后,再通过摘要处理,就能得到隐蔽性更强的摘要值。

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值