在数据库中存储敏感数据,推荐

szi*_*ael 5 python database security passwords postgresql

我正在寻找在数据库中存储敏感数据的最佳解决方案。我知道这是一个常见问题,我已经完成了我的功课(至少这是我的想法),但我想在我做出决定之前先在这里问一下。

假设:

  • 加密数据需要解密。我们正在谈论 SMTP 凭据,如用户名、密码、主机、端口 itp。

我在想两个概念:

  1. 在 passlib.totp 库的帮助下加密数据。为了使这些数据更安全一些,我会将密钥保存在单独的文件中。然后从我所见,我可以使用这个库使用我的密钥将数据解密为纯文本。

  2. 另一个概念是在 postgres 的帮助下在查询请求期间加密和解密数据:

    insert into demo(pw) values ( encrypt( 'data', 'key', 'aes') );
    
    Run Code Online (Sandbox Code Playgroud)

    和:

    decrypt(pw, 'key', 'aes'), 'utf-8')
    
    Run Code Online (Sandbox Code Playgroud)

    这里的密钥也将存储在单独的文件中。

所以我的问题是:

  1. 在代码或数据库中加密/解密数据的更好方法是什么?
  2. 有没有比 passlib.totp 更好(更强大)的库可以使用 -> 我没有使用该库的经验(我知道加密/解密不是存储密码的最安全方式 -> 密码应该是 hased 但我需要以纯文本形式使用用户 smtp 门)。

dav*_*ing 0

最终,您的应用程序需要能够使用某种密钥恢复明文密码。如果您的系统遭到破坏,您必须假设恶意用户只会找到您的密钥(无论是在数据库中还是在磁盘上)并执行与您的应用程序完全相同的解密。

当您的系统需要以可恢复的形式存储密码(即与外部系统进行身份验证)时,您最多只能混淆该信息。这就是人们所说的“通过默默无闻实现安全”时的意思,但这是一个坏主意。

当你表面上安全,但实际上没有保护某些东西时,事情就会变得更加危险。您或管理系统的其他人可能会忽略其他重要的安全措施,因为他们认为敏感信息已经有了一层保护。与假设保护信息的唯一方法是保护保存信息的系统相比,它可能会造成一种社会情况,敏感信息可能容易泄漏。它还可能使人们相信,如果数据从数据库中被盗,“也许没关系,因为他们无法解密”。这就是您最终负责向全世界泄露凭证的原因,因为您必须假设,如果您的应用程序可以获取明文数据,那么破坏您的应用程序的攻击者也可以获取明文数据。

在多个系统上加密多部分密钥(即部分在文件系统上,部分在数据库中)可能有一个非常非常小的优势,因此获得一个系统访问权限的人不一定能够访问另一个系统。可以合理地说,这实际上可能会延迟攻击,或阻止懒惰的攻击者。但一般来说,您的应用程序所在的地方无论如何都可以访问这两个东西,因此如果您的应用程序受到损害,那么您必须假设数据受到损害。(编辑:您在另一条评论中提到您的用户 a)不应该知道数据库中存储的密码,但 b)可以直接访问数据库。相信我,如果您这样做,其中一个用户获得所有这些密码的机会不为零。如果沿着这条路走下去,你就相信了一个有缺陷的保护层。)

tl;dr 存储敏感数据时的可逆加密很少具有实际的、真正的安全价值。如果您试图勾选合规性复选框,并且您无权否决链上需要您勾选该框的人,那么请务必实施“加密”数据的方法。但如果你真的想保护你的系统,请看看其他地方:这里有龙。