如何在使用时存储加密密钥

时间:2017-09-02 10:20:40

标签: security encryption private-key conceptual

我正在创建一个社交媒体类型的网站,我存储用户详细信息,如电子邮件,姓名和其他个人详细信息。

我将使用Encrypt-then-MAC概念加密个人详细信息。当用户注册时,将使用加密安全字符串作为私有加密密钥。当用户选择密码时,将使用密码加密加密密钥。

密码不会存储在数据库中,而是用于解密用于加密个人详细信息的加密密钥的私钥。知道密码的唯一人是用户。我的问题是:解密后如何存储加密密钥?

我想过有一个表有一列用于IP而另一列用于加密密钥,但是有些人关闭浏览器窗口而没有注销,因此当他们没有可能从数据库中删除条目时已经在网站上完成了他们的会议。

另一种方法是将其存储在cookie中,但在发送回服务器时可能会被截获。我想知道是否有一种安全的,几乎万无一失的方式来存储加密密钥,客户端或服务器端。

提前致谢。

编辑:

回复TheGreatContini的回答 - “零知识Web应用程序”(在您的博客中)的想法是一个很好的,但是,对于零知识,即使密钥也不能存储在数据库中,这会使事情变得复杂,因为您必须使用用户的密码作为密钥。使用密码并不安全,因为验证密码有点难以防止已经“使用错误密钥解密”的数据通过。有加密 - 然后 - MAC的概念,但只验证数据是否合法,并假设黑客已经搞砸了一些数据和数据不可信,但是,因为你无法实际验证密码(哈希会不能存储,因为它是“零知识”),所以密码可能只是错误。

1 个答案:

答案 0 :(得分:0)

不确定我有答案,但有一些注意事项:

(1)会话需要超时。也许您可以通过定期运行扫描数据库的批处理作业来查找缺少活动的会话来执行此操作。这需要在db中存储来自用户的最后一个操作的日期。

(2)通常,密钥的值高于它们保护的内容,因为密钥的寿命比保护的单个数据元素长(因为数据可能会更改或可能会添加其他数据)。您可以将解密的内容存储在数据库中,而不是将密钥存储在数据库中。当然,这是你做的(1)。

也许我并没有增加你已经知道的东西,但可能值得考虑a blog I wrote exactly about this topic。低级详细信息从“所有敏感数据的第二道防线”部分开始。在此之前,它主要激发了这一概念。很高兴看到有人真的在做这样的事情。