spring boot下為配置屬性值加密的正確姿勢
最近做電商系統,安全性要求比較高,針對配置屬性值的加密自然也是需要增強的點之一,那麼如何加密呢?
網上搜索了些,有jasypt加密mysql密碼的最為普遍,可惜問題就在於只能加密mysql資訊,其他的redis不能加密,其他的雲app secret也不能加密,此處說的加密是指很方便的增加個pom依賴的情況下,沒法做到;當然如果改一堆關聯配置程式碼肯定是做得到的,可惜程式碼量就大了。
我想實現的是:
- 能加密mysql帳號密碼
- 能加密redis密碼
- 能加密各種雲的secret
- 適用於@Value的取值
- 適用於@ConfigurationProperties前綴屬性值讀取
- 類似這種屬性配置方式:aliyun.sms.accessKeyId=MCKAY_ENC(jXmbmR83PKxubVTQ2y0jgtzdC2LrxpRXA==)
- 能滿足未來的可能存在的可能性,最好是具備普適性,不需要每次都改動程式碼
感覺得從底層進行修改,不能在spring bean的上層進行修改,因為怕實例化後屬性值有些是已經被set進去了,此時即便修改了也無效。
自己實現PropertyPlaceHolder?
是可以,需要繞一圈,然後修改一些spring的class到public才能進行修改,改動也能實現(並且不需要改動任何業務程式碼關聯性),有稍許不太完美,再想想。。。
偶爾看到了org.springframework.boot.env.PropertiesPropertySourceLoader這個類,正好是spring boot用來載入properties格式文件的,似乎是個切入點
如上這個類,是當spring boot/cloud當以properties文件作為配置時的讀取類,如果是yml則是另一個YamlPropertySourceLoader讀取類
我在想,我直接修改PropertiesPropertySourceLoader這個class,讓它判斷屬性值是否是MCKAY_ENC()這個框起來的不就行了,是則調用解密演算法解密,不就搞定了么,對的,搞定了
不過,上述我得override org.springframework.boot.env.PropertiesPropertySourceLoader這個類來加入自己的解密程式碼,有那麼一點點味道,或者說不太完美,怎麼破?
那就增加1種解析器?比如:McKayEncPropertiesPropertySourceLoader.java 自頂一個,來讀取新的文件擴展名,如:application-dev.mckay-enc-properties
這種就好很多了,不太好的地方是此時就需要把原來properties的文件修改擴展名了,因為怎樣去掉某個原生解析器還沒找到辦法,如果有更好方法的,請告知我。
