springboot~configserver裡對重要資訊進行RSA加密

張佔嶺發表於2018-12-21

簡介

參考:https://springcloud.cc/spring-cloud-dalston.html#_encryption_and_decryption_2
RSA非對稱加密有著非常強大的安全性,HTTPS的SSL加密就是使用這種方法進行HTTPS請求加密傳輸的。因為RSA演算法會涉及Private Key和Public Key分別用來加密和解密,所以稱為非對稱加密。Private Key和Public Key有互操作性,即用private key加密的可以用public key解密,用public key加密的可以用private key解密。傳統的單向認證則只用public key進行加密,有private key的一方才可進行解密。例如,一個web伺服器會有一對private key和public key。瀏覽器客戶端儲存著伺服器的public key。當客戶端需要向伺服器傳送資料時,就用伺服器的public key進行加密,然後伺服器收到資料時,再用private key進行解密。客戶端驗證伺服器是否為真實的伺服器時,會根據伺服器提供的public key和自己本地儲存的public key作比較,一致的話才能驗證伺服器的真實性。

在我們的config server中,一些對加密要求比較高的可以採用RSA演算法進行資料的加密和解密

生成測試Keystore

我們需要使用jdk自帶的keytool工具生成一個keystore,裡邊儲存了private key的資訊,使用如下命令列:

keytool -genkeypair -alias config-server-key -keyalg RSA -dname "CN=Config Server,OU=Xuqian,O=My Own Company,L=Beijing,S=Beijing,C=CN" -keypass changeit -keystore server.jks -storepass changeit
  • genkeypair 引數即產生一對public key和private key。
  • alias 指定key的別名,用於區分同一keystore中不同的key。
  • keyalg 指定生成key的演算法,這裡使用預設的RSA
  • dname 指定common name,即CN,用以驗證key的身份。其中各項皆為自定義引數,OU為單位名稱,O為組織名稱,L為城市,S為省份/州,C為國家
  • keypass 為key的密碼
  • keystore 為keystore的檔名
  • storepass 訪問keystore的密碼

上述工具將產生的 privte key 儲存在了名為server.jks的 key store 中。到目前為止,我們只產生了 private key,Spring Cloud Config Server 會根據我們提供的 key 的資訊,每次會用程式生成一個 public key,參考如下原始碼org.springframework.security.rsa.crypto.KeyStoreKeyFactory:
這裡使用了 Java Security API 來對key進行操作。參見注釋。然後上邊的資訊通過 configserver 中的 bootstrap.xml 配置檔案提供:

 encrypt:
  #key: Thisismysecretkey
  key-store:
    location: file://${user.home}/development/keys/server.jks
    password: changeit
    alias: config-server-key
    secret: changeit

因為我們不能同時使用對稱加密和非對稱加密,所以我們把 encrypt.key 配置註釋掉,然後指定非對稱加密的引數:

  • location: Keystore 的檔案路徑
  • password: keystore 的密碼
  • alias: key 的別名
  • secret: key的密碼

測試

我們繼續使用 encrypt API加密一項測試資料

curl http://localhost:8888/encrypt -d lind123

返回加密後的字元:

AQAPWOUOh4WVexGgVv+bgtKc5E0d5Aba8VUKnzEXh27HyKSAbW+wyzDwZTbk5QYfXpoCAs413rdeNIdR2ez44nkjT5V+438/VQExySzjZPhP0xYXi9YIaJqA3+Ji+IWK8hrGtJ4dzxIkmItiimCOirLdZzZGDm/yklMUVh7lARSNuMxXGKlpdBPKYWdqHm57ob6Sb0ivm4H4mL1n4d3QUCuE7hh2F4Aw4oln7XueyMkRPTtPy8OpnBEEZhRfmaL/auVZquLU5jjMNJk9JiWOy+DSTscViY/MZ+dypv6F4AfDdVvog89sNmPzcUT+zmB8jXHdjLoKy+63RG326WffY9OPuImW6/kCWZHV6Vws55hHqRy713W6yDBlrQ/gYC3Wils=

然後測試解密

curl http://localhost:8888/decrypt -d AQAPWOUOh4+bgtKc5E0d5Aba8VUKnzEXh27HyKSAbW+wyzDwZTbk5QYfXpoCAs413rdeNIdR2ez44nkjT5V+438/VQExySzjZPhP0xYXi9YIaJqA3+Ji+IWK8hrGtJ4dzxIkmItiimCOirLdZzZGDm/yklMUVh7lARSNuMxXGKlpdBPKYWdqHm57ob6Sb0ivm4H4mL1n4d3QUCuE7hh2F4Aw4oln7XueyMkRPTtPy8OpnBEEZhRfmaL/auVZquLU5jjMNJk9JiWOy+DSTscViY/MZ+dypv6F4AfDdVvog89sNmPzcUT+zmB8jXHdjLoKy+63RG326WffY9OPuImW6/kCWZHV6Vws55hHqRy713W6yDBlrQ/gYC3Wils=

會返回

lind123

應用到專案

新增依賴

implementation(`org.springframework.security:spring-security-rsa`)

bootstrap.yml內容

user:
  password: `{cipher}AQAPWOUOh4WVexGgVv+bgtKc5E0d5Aba8VUKnzEXh27HyKSAbW+wyzDwZTbk5QYfXpoCAs413rdeNIdR2ez44nkjT5V+438/VQExySzjZPhP0xYXi9YIaJqA3+Ji+IWK8hrGtJ4dzxIkmItiimCOirLdZzZGDm/yklMUVh7lARSNuMxXGKlpdBPKYWdqHm57ob6Sb0ivm4H4mL1n4d3QUCuE7hh2F4Aw4oln7XueyMkRPTtPy8OpnBEEZhRfmaL/auVZquLU5jjMNJk9JiWOy+DSTscViY/MZ+dypv6F4AfDdVvog89sNmPzcUT+zmB8jXHdjLoKy+63RG326WffY9OPuImW6/kCWZHV6Vws55hHqRy713W6yDBlrQ/gYC3Wils=`

訪問:http://localhost:8888/service1/svt

返回內容已經解密了

{

 "user.password": "23456789"

}

相關文章