bal*_*ame 12 security encryption cryptography rsa server-side
许多用户 - 包括我自己 - 希望将他们在Web服务上所做的一切加密的安全性.也就是说,他们不会在网络服务中任何人能够查看他们的帖子,信息,任务等......
在讨论其他很酷的服务时,这也是一个主要的抱怨:http://news.ycombinator.com/item?id = 1549115
由于此数据需要可恢复,因此需要某种双向加密.但除非您在每个请求中提示用户输入加密密钥,否则此密钥将需要存储在服务器上,并且加密数据的点基本上会丢失.
什么是在不降低用户体验的情况下安全加密用户数据的方法(在每个请求中要求一些密钥)?
- 更新 -
从@ Borealid的回答中,我专注于两种可能性:挑战 - 响应协议,其中没有数据(包括密码)在"清除"中发送,而非挑战 - 响应协议,其中数据(包括密码)在"清除"(尽管通过HTTPS).
挑战 - 响应协议(特别是SRP:http://srp.stanford.edu/)
它的实现似乎需要依赖于完全AJAX站点或使用Web存储.这样浏览器可以在加密期间保持质询 - 响应数据,并且还可以在不同"页面"之间保持加密密钥.(我假设在完成身份验证后,我会将它们发送回加密的加密密钥,他们会在客户端解密以获取真正的加密密钥.)
问题是我要么:
此外,由于SRP需要多个请求(http://srp.stanford.edu/design.html),因此需要在服务器端存在一些持久性.这只是另一个难题.
传统
如果我可以清楚地传输密码和数据(虽然通过HTTPS),那么上面的客户端问题就不存在了.
在注册时,我将为用户生成一个随机的唯一加密密钥,并使用他们的密码和随机盐对其进行加密.
在数据库中,我将存储用户的密码哈希和salt(通过bcrypt),加密的加密密钥,加密密钥盐和加密iv.
在身份验证之后,我还需要使用他们的密码来解密加密密钥,以便他们可以查看和输入新数据.我只暂时存储此加密密钥,并在明确"注销"时将其删除.
这种方法存在的问题是(就像@Borealid指出的那样)邪恶的系统管理员在您登录时仍然可以查看您的数据.
用户登录时我也不确定如何存储加密密钥.如果他们在同一个数据存储中,被盗数据库会显示盗窃时登录的所有数据.
是否有更好的内存数据存储来存储这些加密密钥(并在SRP身份验证期间挑战数据)?这是Redis会有用的东西吗?
如果需要在发生用户错误时恢复数据,则不能使用 cookie 之类的东西(它可能会被删除)。正如您所指出的,服务器端密钥实际上并不能保护用户免受恶意系统管理员的攻击。他们只帮助解决诸如数据库离线被盗之类的问题。
然而,如果您正在运行普通的 Web 服务,那么您已经非常幸运了 - 为了保持唯一性和非临时性,用户必须登录。这意味着他们要经过一些身份验证步骤来证明他们的身份。为了证明自己的身份,大多数网站都使用传递的凭据(密码)。
只要您不使用质询-响应身份验证协议(大多数网站不使用这种协议),您就可以使用从服务器端机密和用户密码的组合派生的加密密钥。仅当用户经过身份验证时才存储加密密钥。
如果您这样做,用户在使用该服务(或窃取其密码)时仍然容易受到系统管理员的窥视。您可能想更进一步。要升级,请根本不要将密码发送到服务器。相反,请使用质询响应协议对您的网站进行身份验证,并在上传任何内容之前通过 JavaScript 使用用户密码的派生加密数据。
这是万无一失的安全性:如果您尝试窃取用户的密码,用户可以看到您在做什么,因为盗窃代码就在您发送给他们的页面中。您的网络服务永远不会触及未加密的数据。这也不妨碍正常的用户体验。用户只需像平常一样输入密码即可登录。
Lacie的存储云服务就是使用这种方法。做得非常好。
注意:当我说“使用 foo 加密”时,我的真正意思是“使用 foo 加密安全对称密钥,然后使用随机盐进行加密”。了解你的密码学。我只讲秘诀,不讲方法论。
归档时间: |
|
查看次数: |
6694 次 |
最近记录: |