小伙伴们不难发现市面上有好多种加密解密方式,为此我特地研究一番,在这里整理了一下,希望能帮助到大家!
目录
1.BASE64加密/解密
2.MD5(Message Digest Algorithm)加密
3.DES(Data Encryption Standard)对称加密/解密
4.AES(Advanced Encryption Standard) 加密/解密
5.Hmac(Hash Message Authentication Code,散列消息鉴别码)
6.恺撒加密
7.SHA(Secure Hash Algorithm,安全散列算法)
8.RSA 加密/解密
9.PBE 加密/解密
1.BASE64加密/解密
Base64 编码是我们程序开发中经常使用到的编码方法,它用 64 个可打印字符来表示二进制数据 。这 64 个字符是:小写字母 a-z、大写字母 A-Z、数字 0-9、符号"+"、"/"(再加上作为垫字的"=",实际上是 65 个字符),其他所有符号都转换成这个字符集中的字符 。Base64 编码通常用作存储、传输一些二进制数据编码方法,所以说它本质上是一种将二进制数据转成文本数据的方案 。
通常用作对二进制数据进行加密,示例:
import sun.misc.BASE64Decoder;import sun.misc.BASE64Encoder; public class Base64Util {/**** BASE64解密* @param key* @return* @throws Exception*/ public static byte[] decryBASE64(String key) throws Exception{return (new BASE64Decoder()).decodeBuffer(key); }/**** BASE64加密* @param key* @return* @throws Exception*/ public static String encryptBASE64(byte[] key) throws Exception{return (new BASE64Encoder()).encode(key); } }
2.MD5(Message Digest Algorithm)加密
MD5 是将任意长度的数据字符串转化成短小的固定长度的值的单向操作,任意两个字符串不应有相同的散列值 。因此 MD5 经常用于校验字符串或者文件,因为如果文件的 MD5 不一样,说明文件内容也是不一样的,如果发现下载的文件和给定的 MD5 值不一样,就要慎重使用 。
MD5 主要用做数据一致性验证、数字签名和安全访问认证,而不是用作加密 。比如说用户在某个网站注册账户时,输入的密码一般经过 MD5 编码,更安全的做法还会加一层盐(salt),这样密码就具有不可逆性 。然后把编码后的密码存入数据库,下次登录的时候把密码 MD5 编码,然后和数据库中的作对比,这样就提升了用户账户的安全性 。
是一种单向加密算法,只能加密不能解密,示例:
import JAVA.security.MessageDigest; public class MD5Util {public static final String KEY_MD5 = "MD5";/**** MD5加密(生成唯一的MD5值)* @param data* @return* @throws Exception*/ public static byte[] encryMD5(byte[] data) throws Exception {MessageDigest md5 = MessageDigest.getInstance(KEY_MD5);md5.update(data);return md5.digest(); } }
3.DES(Data Encryption Standard)对称加密/解密
DES 是一种对称加密算法,所谓对称加密算法就是:加密和解密使用相同密钥的算法 。DES 加密算法出自 IBM 的研究,后来被美国政府正式采用,之后开始广泛流传 。但近些年使用越来越少,因为 DES 使用 56 位密钥,以现代的计算能力,24 小时内即可被破解 。
顺便说一下 3DES(Triple DES),它是 DES 向 AES 过渡的加密算法,使用 3 条 56 位的密钥对数据进行三次加密 。是 DES 的一个更安全的变形 。它以 DES 为基本模块,通过组合分组方法设计出分组加密算法 。比起最初的 DES,3DES 更为安全 。
使用 Java 实现 DES 加密解密,注意密码长度要是 8 的倍数 。加密和解密的 Cipher 构造参数一定要相同,不然会报错 。
数据加密标准算法,和BASE64最明显的区别就是有一个工作密钥,该密钥既用于加密、也用于解密,并且要求密钥是一个长度至少大于8位的字符串,示例:
import java.security.Key;import java.security.SecureRandom; import javax.crypto.Cipher;import javax.crypto.KeyGenerator; import sun.misc.BASE64Decoder;import sun.misc.BASE64Encoder; public class DesUtil {private static Key key;private static String KEY_STR="myKey"; private static String CHARSETNAME="UTF-8"; private static String ALGORITHM="DES";static {try {//生成DES算法对象KeyGenerator generator=KeyGenerator.getInstance(ALGORITHM);//运用SHA1安全策略SecureRandom secureRandom=SecureRandom.getInstance("SHA1PRNG");//设置上密钥种子secureRandom.setSeed(KEY_STR.getBytes());//初始化基于SHA1的算法对象generator.init(secureRandom);//生成密钥对象key=generator.generateKey();generator=null;} catch (Exception e) {throw new RuntimeException(e);} }/**** 获取加密的信息* @param str* @return*/ public static String getEncryptString(String str) {//基于BASE64编码,接收byte[]并转换成StringBASE64Encoder encoder = new BASE64Encoder();try {//按utf8编码byte[] bytes = str.getBytes(CHARSETNAME);//获取加密对象Cipher cipher = Cipher.getInstance(ALGORITHM);//初始化密码信息cipher.init(Cipher.ENCRYPT_MODE, key);//加密byte[] doFinal = cipher.doFinal(bytes);//byte[]to encode好的String 并返回return encoder.encode(doFinal);} catch (Exception e) {throw new RuntimeException(e);} }/**** 获取解密之后的信息* @param str* @return*/ public static String getDecryptString(String str) {BASE64Decoder decoder = new BASE64Decoder();try {//将字符串decode成byte[]byte[] bytes = decoder.decodeBuffer(str);//获取解密对象Cipher cipher = Cipher.getInstance(ALGORITHM);//初始化解密信息cipher.init(Cipher.DECRYPT_MODE, key);//解密byte[] doFial = cipher.doFinal(bytes);return new String(doFial, CHARSETNAME);} catch (Exception e) {throw new RuntimeException(e);} } }
推荐阅读
- java分别使用递归和非递归实现二叉树中序遍历
- 为什么Nano IPS这么火?
- java正则-取出指定字符串之间的内容
- 项目中不可忽视的JavaScript优化技巧
- 疑难件是什么意思?
- Java程序员必须知道的Java10特性
- java8中自带常用的函数式接口
- 在Java中使用Optional的开销很大 - pkolaczk
- Java 常用代码汇总
- 极简Redis使用