一、可逆加密算法
1.对称加密
- 解释: 在对称加密算法中,数据发信方将明文和加密密钥一起经过特殊的加密算法处理后,使其变成复杂的加密密文发送出去,收信方收到密文后,若想解读出原文,则需要使用加密时用的密钥以及相同加密算法的逆算法对密文进行解密,才能使其回复成可读明文。在对称加密算法中,使用的密钥只有一个,收发双方都使用这个密钥,这就需要解密方事先知道加密密钥。
- 优点: 对称加密算法的优点是算法公开、计算量小、加密速度快、加密效率高。
- 缺点: 没有非对称加密安全.
- 用途: 一般用于保存用户手机号、身份证等敏感但能解密的信息。
- 常见的对称加密算法有:
AES、DES、3DES、Blowfish、IDEA、RC4、RC5、RC6、HS256
2.非对称加密
- 同时生成两把密钥:私钥和公钥,私钥隐秘保存,公钥可以下发给信任客户端.
加密与解密:- 私钥加密,持有公钥才可以解密
- 公钥加密,持有私钥才可解密
- 优点: 非对称加密与对称加密相比,其安全性更好;
- 缺点: 非对称加密的缺点是加密和解密花费时间长、速度慢,只适合对少量数据进行加密。
- 用途: 一般用于签名和认证。私钥服务器保存, 用来加密, 公钥客户拿着用于对于令牌或者签名的解密或者校验使用.
- 常见的非对称加密算法有:
RSA、DSA(数字签名用)、ECC(移动设备用)、RS256 (采用SHA-256 的 RSA 签名)
二、不可逆加密算法
- 解释: 一旦加密就不能反向解密得到密码原文.
- 种类: Hash加密算法, 散列算法, 摘要算法等
- 用途:一般用于效验下载文件正确性,一般在网站上下载文件都能见到;存储用户敏感信息,如密码、 卡号等不可解密的信息。
- 常见的不可逆加密算法有:
MD5、SHA、HMAC
三、Base64编码
- Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一。Base64编码可用于在HTTP环境下传递较长的标识信息。采用Base64Base64编码解码具有不可读性,即所编码的数据不会被人用肉眼所直接看到。注意:Base64只是一种编码方式,不算加密方法。
四、MD5加密
//md5加密 DegestUtils:spring框架提供的工具类
String md5Str = DigestUtils.md5DigestAsHex("abc".getBytes());
System.out.println(md5Str);//900150983cd24fb0d6963f7d28e17f72
- md5相同的密码每次加密都一样,不太安全
- 手动加密(MD5 + 随机字符串)
- 在MD5的基础上手动加盐值(salt)处理
```java //uername:zhangsan password:123 salt:随时字符串 String salt = RandomStringUtils.randomAlphanumeric(10);//获取一个10位的随机字符串 System.out.println(salt); String pswd = “123”+salt;
- 在MD5的基础上手动加盐值(salt)处理
String saltPswd = DigestUtils.md5DigestAsHex(pswd.getBytes()); System.out.println(saltPswd);
<a name="43ecface"></a>
## 五、BCtypt密码加密
在用户模块,对于用户密码的保护,通常都会进行加密。我们通常对密码进行加密,然后存放在数据库中,在用户进行登录的时候,将其输入的密码进行加密然后与数据库中存放的密文进行比较,以验证用户密码是否正确。 目前,MD5和BCrypt比较流行。相对来说,BCrypt比MD5更安全。
BCrypt 官网[http://www.mindrot.org/projects/jBCrypt/](http://www.mindrot.org/projects/jBCrypt/)
(1)我们从官网下载源码
(2)新建工程,将源码类BCrypt拷贝到工程
(3)新建测试类,main方法中编写代码,实现对密码的加密
```java
String gensalt = BCrypt.gensalt();//这个是盐 29个字符,随机生成
System.out.println(gensalt);
String password = BCrypt.hashpw("123456", gensalt); //根据盐对密码进行加密
System.out.println(password);//加密后的字符串前29位就是盐
(4)新建测试类,main方法中编写代码,实现对密码的校验。BCrypt不支持反运算,只支持密码校验。
boolean checkpw = BCrypt.checkpw("123456", "$2a$10$61ogZY7EXsMDWeVGQpDq3OBF1.phaUu7.xrwLyWFTOu8woE08zMIW");
System.out.println(checkpw);