我想学习/知道其他公司如何处理存储加密密钥的问题。我想加密用户的电子邮件地址(和其他敏感信息),但是(因为我希望能够向用户发送电子邮件),我需要双向加密来解密它。
我做了一些研究,但我还没有完全理解。这就是为什么我支持你的专业知识。
问题是,您应该使用什么作为加密密钥(比如散列密码),或者应该在哪里/如何存储生成的密钥。
将密钥存储在同一个数据库中是没有意义的,因为如果密钥被泄露,密钥也会泄漏,并且数据将是可解密的。但是这些数据需要被程序访问..。
因此,我正在考虑(请告诉我您的意见/专长)一个sqLite数据库,该数据库将(bcrypt散列密码+ mt_rand 64位可变长度字符串)加密密钥链接到user_id。该文件只能从代码中访问(如果nginx / linux受到破坏,则可以从外部访问)。如果用户请求加密的数据,系统将使用用户的id搜索sqlite数据库中的加密密钥,并使用该密钥解密mysql数据库中的数据。
更好的方法是,即使是我也无法访问数据(比如哈希),但系统能够解密,但我认为这是不可能的。
注脚,虽然它会解决这个问题留下的答案,请也分享resources__,它将不仅帮助我解决我的问题。同时也学会了更好的安全。
发布于 2017-09-20 15:16:01
你在这里做什么取决于你的威胁模型和你想要防御的攻击场景。我将假设您试图防止攻击者读取数据库内容(例如,通过SQL注入漏洞),而不是读取文件系统的内容。我也会假设你关心的是机密性而不是完整性或真实性。
值得注意的是,您需要锁定数据库用户的权限,以防止SQL注入通过诸如LOAD DATA INFILE之类的命令获得文件系统访问权,否则数据库访问在大多数情况下也意味着文件系统访问。
针对这种情况保护数据库内容的一般方法是将对称密钥存储在数据库外部,例如在配置变量中或存储在自己的文件中。然后,对于要加密的每一项数据,生成一个IV,并在CBC模式下使用AES加密数据,然后将IV和加密数据作为列存储在数据库中。然后,您可以找到要解密的行,读出IV和加密的电子邮件地址,然后使用从密钥文件加载的密钥进行AES-CBC解密,从而解密该值。
然而,这意味着您不能通过电子邮件地址搜索用户表。Scott最近写了一篇很棒的关于建立可搜索的加密数据库的博客文章,如果这是需要的话,这可能会对你有所帮助。
https://security.stackexchange.com/questions/169859
复制相似问题