首页 文章

如何保护TextEncryptor在spring boot中使用的密码

提问于
浏览
1

我需要为我的应用程序的用户加密一些细节(不是密码,我正在使用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 回答

  • 2

    到目前为止最好的解决方案是使用Spring Cloud Vault,因为我已经在使用spring boot,它可以提供的不仅仅是保护这个密码,实际上它可以保护许多API密钥,数据库等的密码(在编写本文时它是RC版本) )..但是,我不相信这是最终的解决方案,因为我的应用程序仍需要对Vault进行身份验证,但我不得不说这是以更高级的方式完成的,并且比保留密码更进一步在配置文件中......

    问题是鸡和鸡蛋的问题,事实证明SO在类似的场景中有很多类似的问题(在配置中保存数据库密码,在代码中隐藏它,在PBE商店中隐藏密码等) .

    Mark Paluch在他开始使用时很好地解释了这个问题article

    加密数据比未加密数据好一步 . 加密在另一方面强加需要在用户侧进行解密,这需要分发解密密钥 . 现在,你把钥匙放在哪里?密钥是否受密码保护?你把密码短语放在哪里?您分配密钥和密码的系统数量是多少?如你所见,加密引入了鸡蛋问题 . 存储解密密钥使应用程序可以解密数据 . 它还允许攻击向量 . 未经授权的人可以通过访问机器来访问解密密钥 . 那个人可以解密这个密钥可以解密的数据 . 密钥是静态的,因此泄漏的密钥需要更改密钥 . 需要重新加密数据,并且需要更改凭据 . 通过在线测量发现这种泄漏是不可能的,因为数据一旦获得就可以脱机解密 .

    .......

    Vault不是所有安全问题的答案 . 检查Vault安全模型文档以了解威胁模型是值得的 .

    具有讽刺意味的是,对于大多数情况,需要使用纯文本密码配置Vault storage backend(MySQL,S3,Azure,......我不接受这个作为我的问题的答案,但这是我到目前为止找到的,等待的感谢SO贡献者的更多意见!

  • 0

    Vault是一个很好的解决方案,但是一种方法是在初始化组件时手动提供密码,这样它就会存储在内存中而不会输入任何配置文件 .

相关问题