[英]Entity Listener injecting secret key
我有一個基於以下存儲庫的系統:
https://github.com/damienbeaufils/spring-data-jpa-encryption-example
加密/解密數據庫中的字段,它起作用。
但是KeyProperty的方式引發了SonarQube之類的工具的問題
@Component
public class KeyProperty {
public static String DATABASE_ENCRYPTION_KEY;
@Value("${example.database.encryption.key}")
public void setDatabase(String databaseEncryptionKey) {
DATABASE_ENCRYPTION_KEY = databaseEncryptionKey;
}
}
為了克服這個問題,我嘗試將KeyProperty注入到EntityListener上,但是由於如何創建EntityListeners而沒有成功。
我嘗試搜索替代方法,但似乎每個替代方法最終都會中繼從實例方法寫入靜態字段。
編輯:
Sonarqube問題樣本:
使此“ public static DATABASE_ENCRYPTION_KEY”字段為最終字段
類型:漏洞嚴重性:嚴重
但是我要說DATABASE_ENCRYPTION_KEY
不是靜態字段不是強制性的...
您可以將其更改為成員變量,並在AbstractCryptoConverter
使用getKey()
嗎? 乍一看,我看不出原因,為什么它必須是靜態的...
我不知道您的“無效”是什么。 Spring能夠注入抽象類,這不是問題。
我下載了該項目,並使用https://stackoverflow.com/a/13396776/384674將其轉換為Maven(我不是Gradle家伙)。 如果有人感興趣, 可以在GitHugGist上更改pom.xml 。
第一步我做了什么
@Component
public class KeyProperty {
private static String DATABASE_ENCRYPTION_KEY;
@Value("${example.database.encryption.key}")
public void setDatabase(String databaseEncryptionKey) {
DATABASE_ENCRYPTION_KEY = databaseEncryptionKey;
}
public String getKey() {
return DATABASE_ENCRYPTION_KEY;
}
}
另外我不得不交換參照DATABASE_ENCRYPTION_KEY
與keyProperty.getKey()
而我添加@Autowired KeyProperty keyProperty
在AbstractCryptoConverter
也;
我使用靜態DATABASE_ENCRYPTION_KEY
只是為了簡化測試,但是它是私有的,因此無法在其他地方使用。
“問題”是,測試失敗了。 這是因為作者在各處都使用了此靜態變量(這可能就是使用它的原因)。
這些測試也可以正確完成。 我不會修復整個項目(至少今天不會修復),但這是如何使用上述KeyProperty
修復StringCryptoConverterTest
KeyProperty
。
高層次的想法是替換所有任務,例如
KeyProperty.DATABASE_ENCRYPTION_KEY = "MySuperSecretKey";
與(因為使用了Mockito)
when(keyProperty.getKey()).thenReturn("MySuperSecretKey");
另外在setUp()
我添加了(只是因為它不是Spring管理的,所以我們必須自己做DI,我相信有更好的Mockito方法,但是...)
stringCryptoConverter.keyProperty = keyProperty;
spiedStringCryptoConverter.keyProperty = keyProperty;
就是這樣,它又可以工作了...
我不想將整個代碼粘貼到這里,因此您可以導航到GitHubGist 。 我將DATABASE_ENCRYPTION_KEY
所有舊用法留在了源代碼中,以進行清晰的可見性,更改內容以及如何從上面的描述中清除(如果不清楚)。 我對LocalDateCryptoConverterTest
做了類似的事情,但是后來我意識到,您可能對StringCryptoConverterTest
更加感興趣,因此,如果感興趣的話,也可以在GitHubGist上查看LocalDateCryptoConverterTest 。
現在,當我展示它運行良好時,正確的Spring方式是:
@Component
public class KeyProperty {
@Value("${example.database.encryption.key}")
String key;
public String getKey() {
return key;
}
}
而那兩個測試並沒有停止。 可以完全擺脫KeyProperty
,但是需要花費更多的精力來修復測試...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.