1. 引言
1.0 在开发中面临的数据安全问题:
1.数据存储安全
2.数据传输安全(本节我们探究的内容)
1.1 密码学中的常见概念:
ü 明文:指待加密信息
ü 密文:指经过加密后的明文
ü 加签:主要用来验证数据有没有被篡改
ü 加盐:在明文中加入一些无关字符后再进行不可逆加密(例如MD5)
附:MD5加密后的数据是不可逆的,目前的解密策略都是基于碰撞机制进行,本质上并不算是真正的解密
1.2 加解密策略:
l 对称加密:加密和解密使用同一个秘钥
n 常见的对称加密算法:DES、3DES、TDEA、Blowfish、RC2、RC4、RC5、IDEA、SKIPJACK、AES等
l 非对称加密:加密使用公钥(public key),解密使用私钥(private key),公钥和私钥是一对
n 常见的非对称加密算法:RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)等
2. 对称加密—AES
对称加密是最快速、最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key)。
对称加密通常使用的是相对较小的密钥,一般小于256 bit。因为密钥越大,加密越强,但加密与解密的过程越慢。如果你只用1 bit来做这个密钥,那黑客们可以先试着用0来解密,不行的话就再用1解;但如果你的密钥有1 MB大,黑客们可能永远也无法破解,但加密和解密的过程要花费很长的时间。
3. 非对称加密—RSA
非对称加密为数据的加密与解密提供了一个非常安全的方法,它使用了一对密钥,公钥(public key)和私钥(private key)。私钥只能由一方安全保管,不能外泄,而公钥则可以发给任何请求它的人。非对称加密使用这对密钥中的一个进行加密,而解密则需要另一个密钥。比如,你向银行请求公钥,银行将公钥发给你,你使用公钥对消息加密,那么只有私钥的持有人--银行才能对你的消息解密。与对称加密不同的是,银行不需要将私钥通过网络发送出去,因此安全性大大提高。
4. 总结
a. 对称加密与解密使用的是同样的密钥,所以速度快,但由于需要将密钥在网络传输,所以安全性不高。
b. 非对称加密使用了一对密钥,公钥与私钥,所以安全性高,但加密与解密速度慢。
c. 解决的办法是将对称加密的密钥使用非对称加密的公钥进行加密,然后发送出去,接收方使用私钥进行解密得到对称加密的密钥,然后双方可以使用对称加密来进行沟通。
5. 个人建议
Ø 信息量较少的数据使用RSA
Ø 信息量较大的数据使用AES
6. 案例代码(Java实现)
Github地址:https://github.com/maxiao124/security
关于代码概要:查阅wiki
注意:
在使用AES工具类的时候,会出现如下错误:
org.cryptonode.jncryptor.CryptorException: CaughtInvalidKeyException. Do you have unlimited strength jurisdiction filesinstalled?
atorg.cryptonode.jncryptor.AES256JNCryptor.encryptData(AES256JNCryptor.java:494)
at org.cryptonode.jncryptor.AES256JNCryptor.encryptData(AES256JNCryptor.java:345)
atorg.cryptonode.jncryptor.AES256JNCryptor.encryptData(AES256JNCryptor.java:361)
atcom.itheima.security.AESUtil.main(AESUtil.java:20)
Caused by: java.security.InvalidKeyException: Illegal key size
atjavax.crypto.Cipher.checkCryptoPerm(Cipher.java:1024)
at javax.crypto.Cipher.implInit(Cipher.java:790)
atjavax.crypto.Cipher.chooseProvider(Cipher.java:849)
at javax.crypto.Cipher.init(Cipher.java:1348)
at javax.crypto.Cipher.init(Cipher.java:1282)
atorg.cryptonode.jncryptor.AES256JNCryptor.encryptData(AES256JNCryptor.java:481)
... 3 more
问题由来:
因为密钥长度是受限制的,不能超过128位,而我们使用的是256位,java运行时环境读到的是受限的policy文件,文件位于${java_home}/jre/lib/security下,这种限制是由于美国对出口软件的控制
解决方案:
在JDK官网下载JCE无限制权限策略文件,下列分别为JDK7和JDK8的JCE无限制权限策略文件下载地址:
http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html
http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
解锁限制:解压下载好的UnlimitedJCEPolicy文件,里面有两个jar包:
将这两个jar包拷贝到jdk/jre/lib/security文件夹下,覆盖原有文件即可