我正在写一个通讯网站应用程序。为了安全起见,应用程序在将信息存储在数据库中之前对密码和消息进行加密。在当前状态下,消息和密码从客户端(React)发送到服务器(Node.js),在那里它们由bcrypt(服务器端)加密。当服务器从数据库读取存储的消息并将其发送到客户端时,它们由服务器预传输解密。
所以,我有几个问题。
任何帮助,将不胜感激!先感谢您。
塔尔哈已经回答了你的问题,但我会提供一些细节
服务器 - 客户端通信的风险因素是什么,它们之间的信息交换永远不会被加密。
理论上,网络上数据通过的每台计算机都可以读取数据。现实情况更糟 - 目前实施的WPA2安全wifi传输可能被窃听。
我应该打扰加密信息吗?
让我们重新提一下你的问题:我应该传输加密的信息吗?是的,没有理由不这样做(除非你懒得学习如何去做)。使用HTTPS将确保机密性和完整性(没有人会对您的数据感到困惑,并且您说的是正确的服务器)。 HTTPS今天上市。甚至还有免费的证书颁发机构服务(例如letsencrypt.org)。
存储密码时,最好的选择是使用慢速加密哈希(是的,bcrypt会完成这项工作)。散列通常发生在服务器端。
我应该加密客户端的信息吗?大多数情况下,这不是最好的主意。问题是 - 你能合理地管理加密密钥吗?确保数据完整性?确保服务器的身份?限制旁道攻击的选项? TLS为您完成所有工作。你将重新发明一个石轮,而已经有很好的充气橡胶轮胎。
如果我要在传输之前加密客户端上的信息,那么最好的客户端加密库是什么(在React上下文中,如果这有所不同)。
我使用CryptoJS库进行JS加密(我在服务器端使用它,但我认为没关系)。
另外,我如何将加密的服务器信息发送到客户端,客户端使用与bcrypt不同的技术对其进行解密;或者,我应该使用完全客户端加密,而服务器只是读取和写入加密信息而不知道其内容。
只是 - 使用TLS(HTTPS)。在某些时候,您需要信任您的服务器。实际上你仍然应该保护你的数据(比如拥有密码)
你可以建立你自己的加密通信协议(没有人可以阻止你),但它会花费你很多时间,它的安全性仍然是非常值得怀疑的(礼貌地说)。