使用 RSA/RSA+AES 加密网站配置并存储在源代码中是否安全?
Is it safe to encrypt website configuration with RSA/RSA+AES and store in source code?
您可能知道,在源代码中存储数据库密码等软件配置是非常糟糕的。我们可以为我们所有的配置使用环境变量,但它需要创建几十个变量,并且不容易与我们的云提供商一起使用。我的想法是使用 RSA
像这样单独加密所有配置密钥:
// config.json file:
{
"databasePassword": "k32noi23fj3209jf23...",
"awsKey": "qKwmkwfl3j2P?38...",
"smtpPassword": "23kKS293j..."
}
然后,用解密密钥解密每个值:
var decryptionKey = GetSystemEnvironmentVariable("DecryptionKey");
var encryptedDbPassword = ReadConfigSetting("databasePassword");
var decryptedDbPassword = RsaDecrypt(decryptionKey, encryptedDbPassword);
所以我只需要一个环境variable/file来解密配置中的所有密钥,并且密钥不会在源代码中,也不会提供给员工。
4096 位 RSA
对于这样的任务有多安全?如果有人在没有解密密钥的情况下窃取了我的配置文件,是否可以用合理的计算能力重新计算我的解密密钥?如果不够安全,我可以使用 2 个密码,例如先用 RSA
加密,然后用另一个密钥用 AES
加密吗?
好吧,看了你的评论,我认为这是有道理的,这取决于你的风险偏好。它肯定会增加一些风险和一些需要考虑的威胁(详见下文),但对我来说这听起来并没有根本性的缺陷。
一些想法:
将您的参数加密存储在源代码中,为可以访问您的源代码的攻击者提供了无限量的时间和资源来破解加密,至少从理论上是这样。攻击者可能会尝试构建一个大型的并行解密节点集群,也可能会利用您选择的加密算法在未来发现的缺陷。
与此密切相关的是,加密内容的一个注意事项通常是密钥管理。您有时应该更改加密密钥,部分原因是为了减轻上述风险。如果攻击者破解您的密钥所需的时间比您更改密钥的时间间隔长,那么您就很好。
您还应该定期更改配置中包含的秘密。这再次减轻了攻击者可能破坏您的加密的风险的另一个方面。
我会选择一个慢速(计算量大)的算法来解密。虽然 Artjom B. 是正确的,您在技术上不需要 public 用于此目的的密钥加密,但无论如何我可能会使用 RSA,因为对于离线攻击者来说,这可能有更多 CPU 的力量来暴力破解(也取决于密钥长度)。
我会选择比较大的密钥,4096位的RSA看起来不错
简而言之,在我的安全帽中,我不太喜欢这个解决方案,但根据您的场景和用例,您可以决定接受风险。
您可能知道,在源代码中存储数据库密码等软件配置是非常糟糕的。我们可以为我们所有的配置使用环境变量,但它需要创建几十个变量,并且不容易与我们的云提供商一起使用。我的想法是使用 RSA
像这样单独加密所有配置密钥:
// config.json file:
{
"databasePassword": "k32noi23fj3209jf23...",
"awsKey": "qKwmkwfl3j2P?38...",
"smtpPassword": "23kKS293j..."
}
然后,用解密密钥解密每个值:
var decryptionKey = GetSystemEnvironmentVariable("DecryptionKey");
var encryptedDbPassword = ReadConfigSetting("databasePassword");
var decryptedDbPassword = RsaDecrypt(decryptionKey, encryptedDbPassword);
所以我只需要一个环境variable/file来解密配置中的所有密钥,并且密钥不会在源代码中,也不会提供给员工。
4096 位 RSA
对于这样的任务有多安全?如果有人在没有解密密钥的情况下窃取了我的配置文件,是否可以用合理的计算能力重新计算我的解密密钥?如果不够安全,我可以使用 2 个密码,例如先用 RSA
加密,然后用另一个密钥用 AES
加密吗?
好吧,看了你的评论,我认为这是有道理的,这取决于你的风险偏好。它肯定会增加一些风险和一些需要考虑的威胁(详见下文),但对我来说这听起来并没有根本性的缺陷。
一些想法:
将您的参数加密存储在源代码中,为可以访问您的源代码的攻击者提供了无限量的时间和资源来破解加密,至少从理论上是这样。攻击者可能会尝试构建一个大型的并行解密节点集群,也可能会利用您选择的加密算法在未来发现的缺陷。
与此密切相关的是,加密内容的一个注意事项通常是密钥管理。您有时应该更改加密密钥,部分原因是为了减轻上述风险。如果攻击者破解您的密钥所需的时间比您更改密钥的时间间隔长,那么您就很好。
您还应该定期更改配置中包含的秘密。这再次减轻了攻击者可能破坏您的加密的风险的另一个方面。
我会选择一个慢速(计算量大)的算法来解密。虽然 Artjom B. 是正确的,您在技术上不需要 public 用于此目的的密钥加密,但无论如何我可能会使用 RSA,因为对于离线攻击者来说,这可能有更多 CPU 的力量来暴力破解(也取决于密钥长度)。
我会选择比较大的密钥,4096位的RSA看起来不错
简而言之,在我的安全帽中,我不太喜欢这个解决方案,但根据您的场景和用例,您可以决定接受风险。