Security 如何在没有HTTPS的情况下将用户密码安全地发送到后端?

Security 如何在没有HTTPS的情况下将用户密码安全地发送到后端?,security,https,Security,Https,我正试图启动一个涉及用户帐户的爱好/教育项目。当然,用户能够安全地登录是至关重要的。我将为用户存储和传输的信息并不打算是个人或个人可识别的,但原则上我希望密码传输尽可能安全 我知道,从前端将用户密码安全地发送到后端的最佳方法是使用HTTPS。然而,我不想为这个学习/实验项目支付CA费用,也不想收到自签名证书的浏览器警告,因为尽管这是一个爱好项目,但我最终还是想与全世界分享它(就像一个公文包,与朋友分享,让人们真正发现有用和有趣的东西) 诚然,如果我想让它成为一个“投资组合”,我应该使用HTTPS

我正试图启动一个涉及用户帐户的爱好/教育项目。当然,用户能够安全地登录是至关重要的。我将为用户存储和传输的信息并不打算是个人或个人可识别的,但原则上我希望密码传输尽可能安全

我知道,从前端将用户密码安全地发送到后端的最佳方法是使用HTTPS。然而,我不想为这个学习/实验项目支付CA费用,也不想收到自签名证书的浏览器警告,因为尽管这是一个爱好项目,但我最终还是想与全世界分享它(就像一个公文包,与朋友分享,让人们真正发现有用和有趣的东西)

诚然,如果我想让它成为一个“投资组合”,我应该使用HTTPS等最佳实践,但我仍然不想为最终的爱好/学习项目支付年度CA费用

我正在考虑在这里发现的非对称加密解决方案:它与ArthuruhtrA提出的方案非常相似,似乎很有希望。它使用公钥/私钥,因此我可以在前端使用公钥进行加密,并在后端使用私钥/私钥(在将数据存储到数据库之前,会进行适当的盐析/散列操作)对加密数据进行解密。如果不是传统的话,这看起来相当安全吗


有没有其他更好的方法可以安全地将用户信息(如密码)发送到后端,而无需浏览器警告和不必要的花钱?

我不知道最好的答案是什么。显然,您考虑过使用自签名证书。我可能错了,但根据操作系统和浏览器的不同,您可以告诉它信任您已签名的证书

另一个解决方案可能是使用HTTPS背后的非对称加密原理,但不实际使用SSL:在网页中包含服务器的公钥。使用javascript对数据进行加密。然后,您的服务器将能够使用其私钥对其进行解密,而无需中间人

希望有帮助!如果我有别的想法,我会把它加在这里

编辑:
再想一想,这个解决方案会非常容易受到中间人攻击。对不起。

我不知道最好的答案是什么。显然,您考虑过使用自签名证书。我可能错了,但根据操作系统和浏览器的不同,您可以告诉它信任您已签名的证书

另一个解决方案可能是使用HTTPS背后的非对称加密原理,但不实际使用SSL:在网页中包含服务器的公钥。使用javascript对数据进行加密。然后,您的服务器将能够使用其私钥对其进行解密,而无需中间人

希望有帮助!如果我有别的想法,我会把它加在这里

编辑:
再想一想,这个解决方案会非常容易受到中间人攻击。很抱歉。

如果您使用来自JavaScript的加密密码,它就不会很安全,因为它只是客户端自定义,即它不是浏览器提供的服务


我建议您使用带有免费证书的TLS。您应该查看。

如果您使用来自JavaScript的加密密码,它就不会很安全,因为它只是客户端定制,即它不是浏览器提供的服务


我建议您使用带有免费证书的TLS。你应该看看。

你可以在谷歌应用程序中托管自己,或者任何其他已经有SSLI计划在AWS免费层上托管的服务,这样我就可以一路了解AWS。我知道AWS免费提供CA服务,但我必须研究他们是否在免费层提供该服务。即使他们这样做了,在部署到AWS之前,为了在本地进行测试,我是否必须通过自签名证书繁琐程序?可能重复“我仍然不想支付年度CA费用”-您可以从一些CA获得免费证书,就像你可以把自己放在Google Apps中一样——或者任何其他已经有SSLI计划在AWS免费层上启动的服务,这样我就可以一路了解AWS。我知道AWS免费提供CA服务,但我必须研究他们是否在免费层提供该服务。即使他们这样做了,在部署到AWS之前,为了在本地进行测试,我是否必须通过自签名证书的繁琐程序?可能重复“我仍然不想支付年度CA费用”-您可以从一些CA获得免费证书,就像我喜欢非对称密码答案一样。我找到了一个类似的解决方案,这让我很高兴。如果不是传统的话,这和HTTPS一样安全吗?哦,绝对不是。使用中间人攻击拦截连接并用他的密钥替换您的密钥将非常容易。然后他可以读取数据并用你的数据重新加密,这样就不会有人注意到。您必须事先知道用户拥有正确的密钥,或者他们可以使用CA进行验证,并且JavaScript代码没有被篡改。如果使用类似的东西,它必须是一个不是从网站下载的应用程序,而是预先安装的。仔细想想,这是个糟糕的主意。虽然仍然比发送明文要好。如果中间人没有服务器上的私钥,他怎么能读取用公钥加密的数据?如果私钥和公钥都是在服务器上以私钥的形式提前生成的,并且公钥是与客户端JS一起分发的,那么中间的人可以截取数据,但无法对其进行任何处理(即无法解密),对吗?我仍然会验证我在后端解密的任何东西