我需要实现一个免费的方案(没有SSL证书),它可以满足敏感数据传输,保护和存储的要求,假设相互信任的第三方不可用,也就是说,我们不能使用SSL,TLS但这并不意味着我将自己实施SSL,我仍然希望将加密和解密部分外包给现有代码。
我已经将以下方案起草为我的帐户和密码保护解决方案:
对我们的攻击者的假设:
完全了解该协议。
可以访问常用密码的大型词典。
可以窃听客户端和服务器之间的所有通信。
可以在客户端和服务器之间拦截,修改和伪造任意消息。
可以访问客户端的源代码(包括加密代码)。
解决方案:
RSA(分别在客户端和服务器站点加密和解密,公钥可以安全传输,如果密钥是由黑客获取的,则没有风险。)
SHA256 / SHA512 /两次MD5(加密用户ID绑定Salt,都存储在服务器站点的数据库中。我在这里使用绑定盐来避免常用密码并防止彩虹表。)
注册新用户
首先在服务器端生成RSA密钥(存储在会话中);
将公钥发送给客户;
将公钥存储在javascript变量中;
在所有后续请求中,使用此密钥加密数据并发送到服务器;
使用会话中存储的私钥解密服务器端的用户帐户和密码;
使用带有随机盐的单向加密算法加密密码(如常见:SHA-256强于MD5);
将用户ID,哈希密码和随机盐(用户ID绑定)存储到数据库中(避免使用通用密码并构建特定的彩虹表)。
现有用户登录:
首先在服务器端生成RSA密钥(存储在会话中);
将公钥发送给客户;
将公钥存储在javascript变量中;
在所有后续请求中,使用此密钥加密数据并发送到服务器;
使用会话中存储的私钥解密服务器端的用户帐户和密码;
使用用户帐户从数据库中获取哈希密码和salt;
使用获得的随机盐,使用单向加密算法加密密码;
将加密密码与从数据库中获取的哈希密码进行比较;
确定登录成功或失败。
我是这方面的新手,我确实需要你的一些专业建议?该计划足够安全吗?非常感谢。
答案 0 :(得分:6)
这里的主要问题是你做了大量的工作而且你没有获得比自签名SSL证书更好的安全性,并且你把自己设定为关闭任何可能的漏洞的责任方并保持系统的安全性(提示:这是一个大问题)。
因此,如果您正在谈论一个通常可用的Web应用程序,您希望您的用户能够使用,并且放心使用安全性,那么支付签名的SSL证书确实是您唯一的选择。这就是说,一对夫妇注意到:
编辑:在阅读并思考了您正在寻找的内容之后,我想我可能会为您提供解决方案。
您可能想要保护两件事:您的内容和用户凭据。你已经确定你的内容不值得花费每年35美元来保证,这是公平和完全合理的。您仍然希望为用户的凭据提供尽可能多的安全性,因为该信息对于他们以及将利用它的人来说都很有价值。
即使您不想花钱来保护您的内容,您仍然希望它只能由有资质的用户访问。因此,不要让用户创建一个值得保护的用户名/密码,而是让他们使用他们的电子邮件地址登录。
您的内容和电子邮件地址可供具有足够技能和动力的第三方访问,但从您所说的内容来看,您的内容可能不值这么多,而且他们的电子邮件地址也不那么敏感。但是你仍然可以在世界和你的内容之间建立一个登录网关,你可以利用双重选择来限制垃圾邮件等。你可以轻松扩展这样的系统以包含用户名/密码,如果你的内容使用SSL增长要求它。
答案 1 :(得分:2)
如果攻击者“可以在客户端和服务器之间拦截,修改和伪造任意消息”,他们可以更改客户端将获得的JavaScript代码。从此时起,您的整个机制都会崩溃,因为攻击者可以用自己的方式替换您打算执行的任何加密操作。
无论如何,JavaScript加密技术还不够好(参见this article)。
将SSL / TLS与自签名证书一起使用至少可以让您有机会手动向您的客户提供该证书,或让他们记住他们见过的第一张证书(与大多数人的方式类似)当他们通过SSH连接时:他们不一定第一次验证密钥,但在后续连接中查找更改。)
答案 2 :(得分:0)
使用公钥来加密所有数据会在性能上扼杀你。非对称密钥仅用于加密少量数据(例如对称会话密钥)。
您是否考虑过使用像Kerberos这样的机制?它旨在通过非安全网络进行身份验证。它与你正在做的事情截然不同 - 看一看,也许它会给你一些想法。