2017-04-02 38 views
0

我需要爲我的應用程序的用戶(不是密碼,我使用的是bcrypt)加密一些詳細信息,我需要訪問未來,所以我需要能夠解密這些細節,做到這一點,我在我的春季啓動應用程序中有以下類,我的問題是如何保護用於加密文本的密碼?如何確保TextEncryptor在彈簧啓動時使用的密碼

import org.springframework.security.crypto.encrypt.Encryptors; 
import org.springframework.security.crypto.encrypt.TextEncryptor; 

public class Crypto 
{ 

final static String password = "How_to_Secure_This_Password?"; 

public static String encrypt(String textToEncrypt, String salt) 
{ 
    if (textToEncrypt != null && !textToEncrypt.isEmpty()) 
    { 
     TextEncryptor encryptor = Encryptors.text(password, salt); 
     String encryptedText = encryptor.encrypt(textToEncrypt); 
     return encryptedText; 
    } 

    return null; 

} 

public static String decrypt(String encryptedText, String salt) 
{ 
    if(encryptedText != null && !encryptedText.isEmpty()) 
    { 
     TextEncryptor decryptor = Encryptors.text(password, salt); 
     String decryptedText = decryptor.decrypt(encryptedText); 

     return decryptedText; 
    } 

    return null; 

} 
} 

從我的研究,到目前爲止,我可以建議以下解決方案:

1-獲取密碼從屬性文件並使用Spring配置雲計算的加密/解密功能的屬性文件(值前綴與字符串{cipher}),一個好的起點是here。我不喜歡這個解決方案,因爲我不需要客戶端/服務器配置結構,並且我不太喜歡僅僅爲了一個功能而使用它,我相信Spring框架應該具有類似的功能。

2-使用Jasypt庫,或從here對其彈簧啓動的「非官方」支持。再次,不知道問題是否在屬性文件中加密此密碼的問題?

3-使用,看起來建造類似的東西是什麼,我需要在這裏(API密鑰,祕密等...),但它是太多的開銷來構建,維護和整合Vault ......

我的觀點是,如果攻擊者能夠訪問我的數據庫機器,那麼他很可能會訪問應用程序機器,這意味着他可能能夠對該類進行反向工程並能夠解密所有我想要保護的細節!我在這裏感到困惑,這裏的最佳實踐和行業標準是什麼?

回答

0

Vault是一個很好的解決方案,但一種方法是在初始化組件時手動提供密碼,以便將其存儲在內存中,而不是在任何配置文件中鍵入。

2

到目前爲止,最好的解決方案是使用Spring Cloud Vault,因爲我已經使用了spring boot,它可以提供比保護這個密碼更多的功能,實際上它可以保護許多API密鑰,數據庫等的密碼。但是,我不確定這是否是最終的解決方案,因爲我的應用程序仍然需要對Vault進行身份驗證,但我必須說,這是以更高級的方式完成的,並且只需一步進一步比保持配置文件中的密碼...

問題是雞和雞蛋的問題,事實證明,SO有類似的情況下有很多類似的問題(在配置中保存數據庫密碼,隱藏在代碼中,隱藏密碼在PBE店等等)。

這口井由Mark帕盧赫在他的起步解釋article

加密的數據是一步比未加密的更好。另一方面,加密在用戶側需要解密,這需要分發解密密鑰。現在,你把鑰匙放在哪裏?密鑰是否由密碼保護?你把密碼放在哪裏?您在多少個系統上分發密鑰和密碼?

正如你所看到的,加密引入了雞蛋問題。存儲解密密鑰給應用程序解密數據的可能性。它也允許一個攻擊媒介。沒有被授權的人可以通過訪問機器來訪問解密密鑰 。該人可以解密通過該密鑰可解密的數據。關鍵是 靜態,因此泄漏的密鑰需要更改密鑰。數據需要被 重新加密和證書需要被改變。 不可能通過在線度量發現此類泄漏,因爲一旦獲取數據,數據可能會被脫機解密爲 。

.......

庫並非對所有安全問題的答案。值得檢查 的Vault Security Model文檔以瞭解威脅 模型。

諷刺的是,Vault storage backend需要與明文密碼被配置在大多數情況下(MySQL的,S3,天青,......我不接受這個作爲回答我的問題,但是這是我發現迄今爲止,等待更多的意見,謝謝同行SO貢獻者!