背景
加密原理很难,开发倒不难,面试也问经常被问到,然后我就一脸懵逼的看着面试官,我不清楚,不知道,没用过。哎,说多了都是泪。
开发其实就是那么几个工具类。
AES和RSA都是加密算法
AES属于对称加密算法
RSA属于非对称加密算法,公钥和私钥不一致
MD5
对于暴露在互联网上的,RSA最给力啦。
RSA需要维护两个密钥,公钥和私钥,两个是一对。
开发步骤
最简单的开始,MD5
/**
* MD5加密
*/
public static String MD5(String source){
Hasher hasher = Hashing.md5().newHasher();
hasher.putString(source, Charsets.UTF_8);
return hasher.hash().toString().toUpperCase();
}
String uuid =UUID.randomUUID().toString();
用户密码,可以uuid+pwd 然后MD5加密,uuid专业就叫加密盐。防暴力破解的嘛。
AES加密
AES只有一个密钥,加密解密都是他了。一般大家都是代码里写死的,
KeyGenerator kg = KeyGenerator.getInstance( " AES " ); // 获取密匙生成器
kg.init( 256 ); // 初始化
// DES算法必须是56位
// DESede算法可以是112位或168位
// AES算法可以是128、192、256位
SecretKey key = kg.generateKey(); // 生成密匙,可用多种方法来保存密匙
加密:
Cipher cp = Cipher.getInstance( " AES " ); // 创建密码器
cp.init(Cipher.ENCRYPT_MODE, key); // 初始化
String str = " 我是需要被加密的明文 " ;
byte [] ptext = str.getBytes( " UTF8 " );
byte [] ctext = cp.doFinal(ptext); // 加密
//可用多种方式保存
解密:
Cipher cp = Cipher.getInstance( " AES " ); // 创建密码器
cp.init(Cipher.DECRYPT_MODE, key); // 初始化
byte [] ptext = cp.doFinal(ctext); // 解密
String str = new String(ptext, " UTF8 " ); // 重新显示明文
RSA加密
这个加密等级最高,有两把钥匙,当然钥匙多了,开门速度就慢些了。安全和速度本来就矛盾。
这么宝贵的代码我就贴几句,剩下的靠自己去研究了
加密
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(encodedKey);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
解密
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(encodedKey);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, publicKey);