简介
RSA非对称加密有着非常强大的安全性,HTTPS的SSL加密就是使用这种方法进行HTTPS请求加密传输的。因为RSA算法会涉及私钥和公钥分别用来加密和解密,所以称为非对称加密.Private密钥和公钥有互操作性,即用私钥加密的可以用公钥解密,用公钥加密的可以用私钥解密。传统的单向认证则只用公钥进行加密,有私钥的一方才可进行解密,例如,一个web服务器会有一对私钥和公钥。浏览器客户端保存着服务器的公钥。当客户端需要向服务器发送数据时,就用服务器的公钥进行加密,然后服务器收到数据时,再用私钥进行解密。客户端验证服务器是否为真实的服务器时,会根据服务器提供的公钥和自己本地保存的公钥作比较,一致的话才能验证服务器的真实性。
在我们的配置服务器中,一些对加密要求比较高的可以采用RSA算法进行数据的加密和解密。
项目源码
Gitee码云
生成测试Keystore
我们需要使用jdk自带的<代码> keytool> 代码工具生成一个密钥存储库,里边保存了私钥的信息,使用如下命令行:
<代码> keytool -genkeypair别名config-server-key -keyalg RSA -dname“CN=配置服务器,OU=Xuqian, O=我自己的公司,L=北京,S=北京,C=CN”keypass changeit keystore服务器。jks对于storepass changeit 代码>
-genkeypair参数即产生一对公钥和私钥。
别名指定关键的别名,用于区分同一密钥存储库中不同的关键。
-keyalg指定生成键的算法,这里使用默认的RSA
-dname指定通用名称,即CN,用以验证关键的身份。其中各项皆为自定义参数,或者为单位名称,O为组织名称,L为城市,年代为?州份,C为国家
keypass为关键的密码
keystore为密钥库的文件名
对于storepass访问密钥存储库的密码
上述工具将产生的privte关键保存在了名为服务器。jks的密钥存储中。到目前为止,我们只产生了私钥,春云配置服务器会根据我们提供的关键的信息,每次会用程序生成一个公钥,参考如下源代码<代码> org.springframework.security.rsa.crypto.KeyStoreKeyFactory 代码>:
<代码类="语言java ">公共密钥对getKeyPair(字符串别名,char[]密码){ 尝试{ 同步(锁){ 如果(存储==null) { 同步(锁){//根据配置提供的密钥存储库文件地址和密码获取密钥存储库的实例对象 商店=KeyStore.getInstance (jks”); store.load (resource.getInputStream (), this.password); } } }//根据配置提供的别名和密码从密钥库中取得私钥 RSAPrivateCrtKey关键=(RSAPrivateCrtKey)存储。getKey(别名、密码);//定义公钥生成规则 RSAPublicKeySpec规范=new RSAPublicKeySpec (key.getModulus (), key.getPublicExponent ());//生成的公钥 PublicKey PublicKey=KeyFactory.getInstance (RSA) .generatePublic(规范); 返回新密钥对(publicKey键); } 捕获(异常e) { 把新的IllegalStateException(“无法加载密钥存储:”+资源,e); } }代码>
这里使用了Java安全API来对关键进行操作。参见注释。然后上边的信息通过<代码> configserver> 代码中的<代码>引导。xml> 代码配置文件提供:
<代码类=" language-yml ">加密: #键:Thisismysecretkey 密钥存储库: 地点:文件://$ {user.home}/开发/键/server.jks 密码:changeit 别名:config-server-key 秘密:changeit 代码>
因为我们不能同时使用对称加密和非对称加密,所以我们把<代码>加密。关键代码>配置注释掉,然后指定非对称加密的参数:
-
<李>地点:密钥存储库的文件路径李>
<李>密码:密钥存储库的密码李>
<李>别名:关键的别名李>
<李>秘密:关键的密码李>
测试
我们继续使用<代码> 代码>加密API加密一项测试数据:
<代码> curl http://localhost: 8888/加密- d 23456789 代码>
返回加密后的字符:
<代码> AQAPWOUOh5WVexGgVv + bgtKc5E0d5Aba8VUKnzEXh37HyKSAbW + wyzDwZTbk5QYfXpoCAs413rdeNIdR2ez44nkjT5V + 438/VQExySzjZPhP0xYXi9YIaJqA3 +霁+ IWK8hrGtJ4dzxIkmItiimCOirLdZzZGDm/yklMUVh7lARSNuMxXGKlpdBPKYWdqHm57ob6Sb0ivm4H4mL1n4d3QUCuE7hh3F4Aw4oln7XueyMkRPTtPy8OpnBEEZhRfmaL/auVZquLU5jjMNJk9JiWOy + DSTscViY/MZ + dypv6F4AfDdVvog89sNmPzcUT + zmB8jXHdjLoKy + 63 rg326wffy9opuimw6/kCWZHV6Vws55hHqRy713W6yDBlrQ/gYC3Wils=代码>
然后测试解密
<代码> curl http://localhost: 8888/解密- d AQAPWOUOh5 + bgtKc5E0d5Aba8VUKnzEXh37HyKSAbW + wyzDwZTbk5QYfXpoCAs413rdeNIdR2ez44nkjT5V + 438/VQExySzjZPhP0xYXi9YIaJqA3 +霁+ IWK8hrGtJ4dzxIkmItiimCOirLdZzZGDm/yklMUVh7lARSNuMxXGKlpdBPKYWdqHm57ob6Sb0ivm4H4mL1n4d3QUCuE7hh3F4Aw4oln7XueyMkRPTtPy8OpnBEEZhRfmaL/auVZquLU5jjMNJk9JiWOy + DSTscViY/MZ + dypv6F4AfDdVvog89sNmPzcUT + zmB8jXHdjLoKy + 63 rg326wffy9opuimw6/kCWZHV6Vws55hHqRy713W6yDBlrQ/gYC3Wils=春云配置——RSA简介以及使用RSA加密配置文件