该任务可能无法像标题中那样宽泛地解决,但这是我的方案(这有点类似于新闻通讯订阅,因此肯定已经考虑过)
我想在存储有关用户的私人数据的 Web 服务器上实现一个数据库。用户不应该有一个花哨的登录名,而是要“通过电子邮件验证”,即,对邮箱的访问应该足以进行身份验证。
用户应该只能创建、更新、删除他们自己的数据。中央管理应该能够将数据从网络服务器导出到安全主机。
攻击场景是 Web 服务器及其上的所有数据(包括网页脚本和数据库)都受到损害。要求是在妥协之前存储在那里的私人数据仍然受到保护(假设没有尝试进一步的用户访问)。
到目前为止,这是我的想法:要进行身份验证,我只有 users email
。
- 一个新人将他的输入
email
到一个表单中,这会导致代表用户的 ++hash(email)
被存储,并且用户会收到一封邮件,其中包含一个带有参数的URLpublicencrypt(email)
和。(因为只有 (protected)而没有 (unprotected) plus (protected) ,所以不能使用盐之类的东西,我必须求助于,不是吗?)。random nonce
timestamp
random nonce
email
email
username
password
hash(email)
- 现有用户
hash(email)
也会发生同样的情况,只有 与之前的任何尝试相同。publicencrypt(email)
,random nonce
, 并且timestamp
会有所不同。 - 任何人访问上面生成的带有参数的URL,
email
都nonce
可以在检查后对相应的数据库记录进行操作:是否存在匹配hash(email)
和匹配nonce
且不太旧的记录timestamp
?如果是,则用户可以继续。请注意,在此用户的 Web 会话期间,明文email
可用。 - 导出到受保护的中央管理主机是通过按原样导出加密数据来实现的。使用与用于加密的公钥匹配的私钥进行解密(后者被认为是公开的,因为它驻留在可妥协的服务器上)。
至此,通过向isValid
记录添加标志来完成添加新条目。删除记录当然很容易做到。显示非机密数据(例如,何时创建或上次修改条目)也是一项微不足道的任务。
我的问题是:如何安全地处理额外的私人数据?我可能只是以加密形式(如电子邮件)存储它,但在这种情况下,内容甚至无法显示给经过身份验证的用户。他可以更改它,但不能在以后的网络会话中解密它。这当然是次优的。我唯一的想法是使用不同的密钥对附加数据进行加密:使用可重复生成的对称密钥代替非对称密钥对的公钥,即将email
附加数据存储为symmetricencrypt(data,key_generated_from(email))
。由于明文email
在用户自己的网络会话期间以及在安全主机上的解密导出中可供用户自己使用,data
因此可以重建。
我看到以下问题:
- 鉴于电子邮件地址的格式受限(例如,某些域可能经常出现),如上所述从电子邮件生成的密钥是否足够安全?
- 实际上,鉴于电子邮件地址格式的限制,
hash(email)
我在仅保护电子邮件的基本概念中使用的是否足够好?(可以这么说,电子邮件地址中是否有足够的熵?) - 有更好的方法吗?