簡體   English   中英

實體偵聽器注入密鑰

[英]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_KEYkeyProperty.getKey()而我添加@Autowired KeyProperty keyPropertyAbstractCryptoConverter也;

我使用靜態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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM