我正在编写一个多租户应用程序,它代表每个客户与几个不同的API交互。显然,我们需要在数据库中存储这些不同API的私钥,以便能够连接到它们。不用说,我需要加密这些。
我想对系统上的每个租户使用一个单独的加密密钥(我使用的是openssl_encrypt和AES-256-CBC)。为了实现这一点,我有一个单独的“密码”数据库。tenant_keys表包含以下列:
tenant_hash,它具有存储在租户设置表中的随机值,用于查找tenant_key,它是租户的唯一加密密钥。key_timestamp,我将来会用它定期更新租户明显的缺点是,如果数据库被窃取,攻击者就会拥有所有的密钥。为了解决这个问题,我生成了一个“主密钥”,它作为文本文件存储在服务器上。然后使用这个主密钥加密所有不同的租户密钥。因此,当第一次启动会话并查找租户时,租户的密钥将被解密并存储在会话中。下面是我的问题:
master_key文件要过分呢?)发布于 2018-09-13 05:50:23
的防护
首先,设计是一个登录系统,这样用户就不能设置错误的密码,并且可以对彩虹表进行保护。一个很好的解决方案是使用盐,就像在bcrypt中一样。
公钥
为每个用户生成公共-私有对。然后,用密码加密用户的私钥,并选择密码密钥派生函数PKDF,这样就可以防止对用户密码的猜测和暴力攻击。您可以使用他们的密码加密和解密密钥-加密密钥。
当您希望向用户发送消息时,生成会话密钥并使用AES加密算法对消息进行加密,使用适当的方案CBC、CTR或GCM,并使用适当的填充方案将会话密钥由用户公钥保护。
稍后,当用户登录系统时,您可以使用他们的密码解密他们的私钥,并通过提取每条消息的会话密钥打开消息(如果有的话)。希望这一切都清楚。
https://crypto.stackexchange.com/questions/62238
复制相似问题