HTTPS有许多用例,其中大多数用于防御中间人攻击。任何有黑客思维的人都会不停地告诉您,除了确定的方法之外,别无他法。事实是,仅仅因为您使用TLS(现代HTTPS使用的标准),并不意味着您使用得很好。此外,仅使用TLS并不能防止某人利用已知的弱点。正如您可能会找到创新的方法来保护数据安全一样,有些人也在寻找创新的方法来利用您的安全措施。
那么该怎么办?
首先,如果您要放弃TLS,了解它的工作原理将很有帮助。一切都与握手有关。
一旦客户端和服务器同意使用TLS,他们就会通过握手程序协商有状态连接。[7] 在此握手期间,客户端和服务器会同意用于建立连接安全性的各种参数:
- 当客户端连接到启用了TLS的服务器以请求安全连接并显示受支持的密码套件(密码和哈希函数)列表时,握手开始。
- 服务器从该列表中选择一个它也支持的密码和哈希函数,并将决定通知客户端。
- 服务器以数字证书的形式发回其标识。[矛盾]证书通常包含服务器名称,可信证书颁发机构(CA)和服务器的公共加密密钥。
- 客户端可以与颁发证书的服务器(如上所述的受信任CA)联系,并在继续操作之前确认证书的有效性。
- 为了生成用于安全连接的会话密钥,客户端使用服务器的公共密钥对随机数进行加密,然后将结果发送到服务器。只有服务器应该能够使用其私钥对其进行解密。
- 双方都从随机数生成用于加密和解密的密钥材料。[矛盾]这结束了握手,并开始了安全连接,该安全连接使用密钥材料进行加密和解密,直到连接关闭。
如果以上任何一个步骤失败,则TLS握手失败,并且不会创建连接。
资料来源:维基百科
那么,有可能吗?是。我被告知一切皆有可能。它可能很昂贵,但始终是可能的。
我想充分说明我不是安全专家,而是狂热者。我不建议您将其用于生产级项目或您自己的版本之外的其他项目。您应该明确查看此SO帖子,它为设置您自己的安全协议提供了很好的解释。
但是,如果您想继续前进,请记住以下一些想法。无论您直接从事此项目如何,这些现实都会存在。
所有主要的现代浏览器都支持HTTPS。即使在这种情况下,HTTPS加载时间也比普通HTTP慢。如果不进行大量生产,则您的替代实现很可能仅是安全性的一小部分,但速度明显慢得多。除非您使用浏览器功能,否则这将是任何本地实现的缺点,这使我们全面回到使用TLS(现代HTTPS使用的功能)的角度。
如果您设法在浏览器端使用Javascript以一种无法预测的方式来加密密码而不使用TLS,以至于MiTM攻击将很难进行,请不要就此止步。您还应该保护来回发送的数据。否则,加密的密码实际上是无关紧要的。当然,攻击者可能不知道bobsmith109的密码,但是他不需要它,因为他可以嗅探网络上的每个活动。他知道bobsmith109登录的时间,可能可以跟踪他的IP以及来回发送的任何其他敏感数据。
不管您采取什么安全措施,都需要深入的安全性。因此,您可以立即做的一件事是确保您在加密数据库中的数据的同时还要求使用强密码。
我重申,我不是安全专家,因此除了满足您的好奇心外,强烈建议不要这样做。从天文学角度讲,您不可能创建一种可行的TLS替代方案,而无需花费大量的安全专业人员来为一个项目贡献数年甚至数十年的时间,而这正是SSL / TLS所能证明的。话虽如此,如果您选择继续前进,一个很好的起点是查看上面的握手模型,并了解如何在不使用TLS的情况下实现该版本。
我不愿在我的帖子中不分享正在积极反对使用HTTPS的大多数现实障碍。其中最大的一项-成本-即将成为非问题。包括Mozilla和Akamai在内的一些知名人士将在2015年第二季度发布免费的证书颁发机构。这是一篇文章。