2017-04-02 62 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贡献者!

相关问题