這幾天公司在排查內部資料賬號洩漏,原因是發現某些實習生小可愛居然連帶著賬號、密碼將源碼私傳到GitHub上,導致核心資料外漏,孩子還是沒捱過社會毒打,這種事的後果可大可小。說
2021-08-05 12:22:52
這幾天公司在排查內部資料賬號洩漏,原因是發現某些實習生小可愛居然連帶著賬號、密碼將源碼私傳到GitHub
上,導致核心資料外漏,孩子還是沒捱過社會毒打,這種事的後果可大可小。
說起這個我是比較有感觸的,之前我TM被刪庫的經歷,到現在想起來心裡還難受,我也是把資料庫賬號明文密碼誤提交到GitHub
,然後被哪個大寶貝給我測試庫刪了,後邊我長記性了把配置檔案內容都加密了,資料安全問題真的不容小覷,不管工作匯還是生活,敏感資料一定要做脫敏處理。
如果對脫敏概念不熟悉,可以看一下我之前寫過的一篇大廠也在用的6種資料脫敏方案,裡邊對脫敏做了簡單的描述,接下來分享工作中兩個比較常見的脫敏場景。
實現配置的脫敏我使用了Java
的一個加解密工具Jasypt
,它提供了單金鑰對稱加密
和非對稱加密
兩種脫敏方式。
單金鑰對稱加密:一個金鑰加鹽,可以同時用作內容的加密和解密依據;
非對稱加密:使用公鑰和私鑰兩個金鑰,才可以對內容加密和解密;
以上兩種加密方式使用都非常簡單,咱們以springboot
整合單金鑰對稱加密方式做示例。
首先引入jasypt-spring-boot-starter
jar
配置檔案加入金鑰配置項jasypt.encryptor.password
,並將需要脫敏的value
值替換成預先經過加密的內容ENC(mVTvp4IddqdaYGqPl9lCQbzM3H/b0B6l)
。
這個格式我們是可以隨意定義的,比如想要abc[mVTvp4IddqdaYGqPl9lCQbzM3H/b0B6l]
格式,只要配置字首和字尾即可。
ENC(XXX)格式主要為了便於識別該值是否需要解密,如不按照該格式配置,在載入配置項的時候jasypt
將保持原值,不進行解密。
金鑰是個安全性要求比較高的屬性,所以一般不建議直接放在項目內,可以通過啟動時-D
參數注入,或者放在配置中心,避免洩露。
java -jar -Djasypt.encryptor.password=1123 springboot-jasypt-2.3.3.RELEASE.jar
預先生成的加密值,可以通過程式碼內呼叫API生成
或者通過如下Java命令生成,幾個參數D:maven_liborgjasyptjasypt1.9.3jasypt-1.9.3.jar
為jasypt核心jar包,input
待加密文字,password
祕鑰,algorithm
為使用的加密演算法。
java -cp D:maven_liborgjasyptjasypt1.9.3jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="root" password=xiaofu algorithm=PBEWithMD5AndDES
一頓操作後如果還能正常啟動,說明配置檔案脫敏就沒問題了。
生產環境使用者的隱私資料,比如手機號、身份證或者一些賬號配置等資訊,入庫時都要進行不落地脫敏,也就是在進入我們系統時就要實時的脫敏處理。
使用者資料進入系統,脫敏處理後持久化到資料庫,使用者查詢資料時還要進行反向解密。這種場景一般需要全局處理,那麼用AOP
切面來實現在適合不過了。
首先自定義兩個註解@EncryptField
、@EncryptMethod
分別用在欄位屬性和方法上,實現思路很簡單,只要方法上應用到@EncryptMethod
註解,則檢查入參欄位是否標註@EncryptField
註解,有則將對應欄位內容加密。
切面的實現也比較簡單,對入參加密,返回結果解密。為了方便閱讀這裡就只貼出部分程式碼,完整案例Github地址:https://github.com/chengxy-nds/Springboot-Notebook/tree/master/springboot-jasypt
緊接著測試一下切面註解的效果,我們對欄位mobile
、address
加上註解@EncryptField
做脫敏處理。
請求這個介面,看到參數被成功加密,而返回給使用者的資料依然是脫敏前的資料,符合我們的預期,那到這簡單的脫敏實現就完事了。
Jasypt
工具雖然簡單好用,但作為程式設計師我們不能僅滿足於熟練使用,底層實現原理還是有必要了解下的,這對後續偵錯bug、二次開發擴展功能很重要。
個人認為Jasypt
配置檔案脫敏的原理很簡單,無非就是在具體使用配置資訊之前,先攔截獲取配置的操作,將對應的加密配置解密後再使用。
具體是不是如此我們簡單看下源碼的實現,既然是以springboot
方式整合,那麼就先從jasypt-spring-boot-starter
源碼開始入手。
starter
程式碼很少,主要的工作就是通過SPI
機制註冊服務和@Import
註解來注入需前置處理的類JasyptSpringBootAutoConfiguration
。
在前置載入類EnableEncryptablePropertiesConfiguration
中註冊了一個核心處理類EnableEncryptablePropertiesBeanFactoryPostProcessor
。
它的構造器有兩個參數,ConfigurableEnvironment
用來獲取所有配屬資訊,EncryptablePropertySourceConverter
對配置資訊做解析處理。
順藤摸瓜發現具體負責解密的處理類EncryptablePropertySourceWrapper
,它通過對Spring
屬性管理類PropertySource<T>
做拓展,重寫了getProperty(String name)
方法,在獲取配置時,凡是指定格式如ENC(x) 包裹的值全部解密處理。
既然知道了原理那麼後續我們二次開發,比如:切換加密演算法或者實現自己的脫敏工具就容易的多了。
案例Github地址:https://github.com/chengxy-nds/Springboot-Notebook/tree/master/springboot-jasypt
PBE演算法
再來聊一下Jasypt
中用的加密演算法,其實它是在JDK的JCE.jar
包基礎上做了封裝,本質上還是用的JDK提供的演算法,預設使用的是PBE
演算法PBEWITHMD5ANDDES
,看到這個演算法命名很有意思,段個句看看,PBE、WITH、MD5、AND、DES 好像有點故事,繼續看。
PBE
演算法(Password Based Encryption
,基於口令(密碼)的加密)是一種基於口令的加密演算法,其特點在於口令是由使用者自己掌握,在加上隨機數多重加密等方法保證資料的安全性。
PBE演算法本質上並沒有真正構建新的加密、解密演算法,而是對我們已知的演算法做了包裝。比如:常用的訊息摘要演算法MD5
和SHA
演算法,對稱加密演算法DES
、RC2
等,而PBE
演算法就是將這些演算法進行合理組合,這也呼應上前邊演算法的名字。
既然PBE演算法使用我們較為常用的對稱加密演算法,那就會涉及金鑰的問題。但它本身又沒有鑰的概念,只有口令密碼,金鑰則是口令經過加密演算法計算得來的。
口令本身並不會很長,所以不能用來替代金鑰,只用口令很容易通過窮舉攻擊方式破譯,這時候就得加點鹽了。
鹽通常會是一些隨機資訊,比如隨機數、時間戳,將鹽附加在口令上,通過演算法計算加大破譯的難度。
源碼裡的貓膩
簡單瞭解PBE演算法,回過頭看看Jasypt
源碼是如何實現加解密的。
在加密的時候首先例項化祕鑰工廠SecretKeyFactory
,生成八位鹽值,預設使用的jasypt.encryptor.RandomSaltGenerator
生成器。
由於預設使用的是隨機鹽值生成器,導致相同內容每次加密後的內容都是不同的。
那麼解密時該怎麼對應上呢?
看上邊的源碼發現,最終的加密文字是由兩部分組成的,params
訊息頭裡邊包含口令和隨機生成的鹽值,encryptedMessage
密文。
而在解密時會根據密文encryptedMessage
的內容拆解出params
內容解析出鹽值和口令,在呼叫JDK底層演算法解密出實際內容。
相關文章
這幾天公司在排查內部資料賬號洩漏,原因是發現某些實習生小可愛居然連帶著賬號、密碼將源碼私傳到GitHub上,導致核心資料外漏,孩子還是沒捱過社會毒打,這種事的後果可大可小。說
2021-08-05 12:22:52
事實表明,通過人工來擴展、調配和配置雲端計算資源通常會出現錯誤,從而影響業務的可用性或效能。那麼其解決方案是什麼?是雲端計算自動化。以下將瞭解科技行業中最具影響力的
2021-08-05 12:22:48
作為現象級國民手遊,王者榮耀到底有多流行?根據王者榮耀官方在2020年公佈的資料,王者榮耀光是日活躍使用者就已經破1億,相當於14個人中就有一個人每天都在玩王者榮耀。 年輕人群
2021-08-05 12:22:39
#IDC統計小米手機全球市佔率第二#小米最新的面板版本稱為MIUI 12,在2020年4月27日釋出,然後就不斷地向一代代小米手機推送。由於 MIUI 12已經在31 款手機上廣泛使用,很多人認為
2021-08-05 12:22:33
說到滑鼠你們最先會想到哪個品牌呢?最近一段時間物件剛好在琢磨著說要給自己的辦公桌面更換一個滑鼠,問我有沒有什麼建議?聆聽了她的需求之後,二話沒說就入手了這款洛斐小瓣無線
2021-08-05 12:22:23
由於拼多多的市值從最高峰跌落一半,如今有媒體人士質疑拼多多是否有存在的意義,認為它只是靠補貼很難長久發展下去,對此柏銘科技認為可以從另外兩大電商的業績來看看拼多多是否
2021-08-05 12:22:13