这个需求很简单就是存储数据库密码,因为链接数据库的需要用到,加密就必须要用对称加密算法,于是简单调研了一下对称加密算法,经过对比最后选择了AES算法-CBC模式
怎么理解对称加密
加密:接收秘钥key和明文,然后输出密文。
解密:通过key解密密文,得到明文
例: 加密 123 =》AES( 123 + key ) =》@#$ 解密 @#$ =》AES( key + @#$ ) =》123
对比
这里简单对我了解过的对称加密算法做个比较
算法密钥长度运算速度安全性资源消耗DES56/64较快低(完全依赖密钥,易受穷举搜索法攻击)中AES128/192/256快高(ECB模式生成固定密钥安全性低,CBC模式每次生成的密文都不同安全性高)低IDEA128较慢高(军事级,可抗差值分析和相关分析)中
1、DES(Data Encryption Standard):对称算法,数据加密标准,速度较快,适用于加密大量数据的场合;
2、IDEA(International Data Encryption Algorithm)国际数据加密算法,使用 128位密钥提供非常强的安全性;
3、AES(Advanced Encryption Standard):高级加密标准,对称算法,是下一代的加密算法标准,速度快,安全级别高,在21世纪AES 标准的一个实现是 Rijndael算法;
密钥长度直接决定加密强度,DES算法由于密钥过短,可以在短时间内被暴力破解,所以现在已经不安全了。
算法选择
既然要使用对称加密算法,那么就必须要考虑两点,安全性和性能,那么针对上面三种算法,显而易见的AES的CBC模式是不二之选
代码demo实现
importjavax.crypto.Cipher;importjavax.crypto.spec.IvParameterSpec;importjavax.crypto.spec.SecretKeySpec;importjavax.xml.bind.DatatypeConverter;importjava.nio.charset.StandardCharsets;importjava.security.SecureRandom;publicclassSecretUtil{//这里需要设置你的32位字节密钥publicstaticfinalString ENCRYPT_OR_DECRYPT_KEY ="1234567890abcdef1234567890abcdef";// 256位密钥 = 32 bytes Key://CBC模式是安全性较高的AES加密模式,它需要一个随机数作为IV参数,这样对于同一份明文,每次生成的密文都不同publicstaticfinalbyte[] BYTES_KEY = ENCRYPT_OR_DECRYPT_KEY.getBytes(StandardCharsets.UTF_8);publicstaticfinalString INSTANCE ="AES/CBC/PKCS5Padding";publicstaticfinalString AES ="AES";publicstaticvoidmain(String[] args)throwsException{String password ="你来打我呀!";String encryptStr1 =encrypt(password);System.out.println("第一次加密:"+ encryptStr1);String decryptStr1 =decrypt(encryptStr1);System.out.println("第一次解密:"+ decryptStr1);String encryptStr2 =encrypt(password);System.out.println("我每次加密都不一样:"+ encryptStr2);String decryptStr2 =decrypt(encryptStr1);System.out.println("但我每次都能得到你:"+ decryptStr2);}// 加密publicstaticStringencrypt(String password)throwsException{Cipher cipher =Cipher.getInstance(INSTANCE);SecretKeySpec keySpec =newSecretKeySpec(BYTES_KEY, AES);// CBC模式需要生成一个16 bytes的initialization vectorSecureRandom sr =SecureRandom.getInstanceStrong();byte[] iv = sr.generateSeed(16);IvParameterSpec ivps =newIvParameterSpec(iv);
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivps);byte[] data = cipher.doFinal(password.getBytes(StandardCharsets.UTF_8));// IV不需要保密,把IV和密文一起返回returnDatatypeConverter.printBase64Binary(join(iv, data));}// 解密publicstaticStringdecrypt(String password)throwsException{byte[] iv =newbyte[16];byte[] input =DatatypeConverter.parseBase64Binary(password);byte[] data =newbyte[input.length -16];// 把password分割成IV和密文System.arraycopy(input,0, iv,0,16);System.arraycopy(input,16, data,0, data.length);// 解密Cipher cipher =Cipher.getInstance(INSTANCE);SecretKeySpec keySpec =newSecretKeySpec(BYTES_KEY, AES);IvParameterSpec ivps =newIvParameterSpec(iv);
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivps);returnnewString(cipher.doFinal(data),StandardCharsets.UTF_8);}publicstaticbyte[]join(byte[] bs1,byte[] bs2){byte[] r =newbyte[bs1.length + bs2.length];System.arraycopy(bs1,0, r,0, bs1.length);System.arraycopy(bs2,0, r, bs1.length, bs2.length);return r;}}
输出验证:
好了,对称加密算法之AES算法-CBC模式的简单应用就介绍到这里
参考文章:廖雪峰的官方网站-对称加密算法
版权归原作者 鲲志说 所有, 如有侵权,请联系我们删除。