szi*_*ael 5 python database security passwords postgresql
我正在寻找在数据库中存储敏感数据的最佳解决方案。我知道这是一个常见问题,我已经完成了我的功课(至少这是我的想法),但我想在我做出决定之前先在这里问一下。
假设:
我在想两个概念:
在 passlib.totp 库的帮助下加密数据。为了使这些数据更安全一些,我会将密钥保存在单独的文件中。然后从我所见,我可以使用这个库使用我的密钥将数据解密为纯文本。
另一个概念是在 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)
这里的密钥也将存储在单独的文件中。
所以我的问题是:
最终,您的应用程序需要能够使用某种密钥恢复明文密码。如果您的系统遭到破坏,您必须假设恶意用户只会找到您的密钥(无论是在数据库中还是在磁盘上)并执行与您的应用程序完全相同的解密。
当您的系统需要以可恢复的形式存储密码(即与外部系统进行身份验证)时,您最多只能混淆该信息。这就是人们所说的“通过默默无闻实现安全”时的意思,但这是一个坏主意。
当你表面上很安全,但实际上没有保护某些东西时,事情就会变得更加危险。您或管理系统的其他人可能会忽略其他重要的安全措施,因为他们认为敏感信息已经有了一层保护。与假设保护信息的唯一方法是保护保存信息的系统相比,它可能会造成一种社会情况,敏感信息可能更容易泄漏。它还可能使人们相信,如果数据从数据库中被盗,“也许没关系,因为他们无法解密”。这就是您最终负责向全世界泄露凭证的原因,因为您必须假设,如果您的应用程序可以获取明文数据,那么破坏您的应用程序的攻击者也可以获取明文数据。
在多个系统上加密多部分密钥(即部分在文件系统上,部分在数据库中)可能有一个非常非常小的优势,因此获得一个系统访问权限的人不一定能够访问另一个系统。可以合理地说,这实际上可能会延迟攻击,或阻止懒惰的攻击者。但一般来说,您的应用程序所在的地方无论如何都可以访问这两个东西,因此如果您的应用程序受到损害,那么您必须假设数据受到损害。(编辑:您在另一条评论中提到您的用户 a)不应该知道数据库中存储的密码,但 b)可以直接访问数据库。相信我,如果您这样做,其中一个用户获得所有这些密码的机会不为零。如果沿着这条路走下去,你就相信了一个有缺陷的保护层。)
tl;dr 存储敏感数据时的可逆加密很少具有实际的、真正的安全价值。如果您试图勾选合规性复选框,并且您无权否决链上需要您勾选该框的人,那么请务必实施“加密”数据的方法。但如果你真的想保护你的系统,请看看其他地方:这里有龙。