我需要为我的应用程序的用户加密一些细节(不是密码,我正在使用bcrypt),我需要在将来的某个时候访问细节,所以我需要能够解密这些细节,到这样做,我的 Spring 季启动应用程序中有以下类,我的问题是如何保护用于加密文本的密码?
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 Cloud Config作为属性文件的加密/解密功能(前缀为字符串的值),一个很好的起点是here . 我不需要客户端/服务器配置结构,我只是为了一个功能而感觉不好,我相信Spring框架应该有类似的功能 .
2-使用Jasypt库或其'unofficial'支持从here进行 spring 启动 . 同样,不确定问题是否是在属性文件中加密此密码的问题?
3-使用Vault看起来像我在这里需要的东西(API密钥,秘密等......),但是构建,维护和集成的开销太大了......
我的论点是,如果攻击者能够访问我的数据库机器,那么他很可能能够访问应用程序机器,这意味着他可能能够对该类进行逆向工程并且能够解密我要保证的所有细节!我觉得很困惑,这里的最佳实践和行业标准是什么?
2 回答
到目前为止最好的解决方案是使用Spring Cloud Vault,因为我已经在使用spring boot,它可以提供的不仅仅是保护这个密码,实际上它可以保护许多API密钥,数据库等的密码(在编写本文时它是RC版本) )..但是,我不相信这是最终的解决方案,因为我的应用程序仍需要对Vault进行身份验证,但我不得不说这是以更高级的方式完成的,并且比保留密码更进一步在配置文件中......
问题是鸡和鸡蛋的问题,事实证明SO在类似的场景中有很多类似的问题(在配置中保存数据库密码,在代码中隐藏它,在PBE商店中隐藏密码等) .
Mark Paluch在他开始使用时很好地解释了这个问题article
.......
具有讽刺意味的是,对于大多数情况,需要使用纯文本密码配置Vault storage backend(MySQL,S3,Azure,......我不接受这个作为我的问题的答案,但这是我到目前为止找到的,等待的感谢SO贡献者的更多意见!
Vault是一个很好的解决方案,但是一种方法是在初始化组件时手动提供密码,这样它就会存储在内存中而不会输入任何配置文件 .