我正在编写一个通讯网站应用程序。为了安全起见,应用程序先将密码和消息加密,然后再将信息存储在数据库中。在当前状态下,消息和密码从客户端(React)发送到服务器(Node.js),并在其中由bcrypt加密(服务器端)。当服务器从数据库中读取存储的消息并将其发送到客户端时,它们将通过服务器的预传输进行解密。
所以,我有几个问题。
服务器与客户端之间的通信从未加密的风险因素是什么。
我应该麻烦加密信息吗?
如果我应该在传输之前麻烦加密客户端上的信息,那么这样做的最佳客户端加密库是什么(在React上下文中,如果有所作为)。
此外,我将如何向客户端发送加密的服务器信息,客户端使用与bcrypt不同的技术对其进行解密;或者,我应该完全使用客户端加密,而服务器只是在不知道其内容的情况下读写加密信息。
任何帮助将不胜感激!预先谢谢你。
答案 0 :(得分:2)
在进行通信时,应始终使用安全的通信方法。例如HTTPS。而且,在处理套接字时,您可以使用通过TLS / SSL加密连接的网络套接字安全(WSS)。
如果您使用HTTPS和WSS,则您的通信已经使用SSL加密,因此除非绝对必要,否则您不必费心在客户端加密数据。
bcrypt
是Niels Provos和DavidMazières基于Blowfish密码设计的密码哈希功能。 哈希不可逆。创建散列后,您将无法对其进行解密。
如果需要解密,可以使用AES256。有关AES的更多信息,您可以从WIKIPEDIA
bcrypt
是一种算法,并且可以用任何语言实现,而且bcrypt(npm软件包)是该算法的实现。
答案 1 :(得分:2)
塔拉(Talha)已经回答了您的问题,尽管我只会提供一些详细信息
服务器与客户端之间的通信从未加密的风险因素是什么。
理论上,数据传递到网络上的每台计算机都可以读取数据。现实情况更糟-可能会窃听当前实施的WPA2安全wifi传输。
我应该麻烦加密信息吗?
让我们重新表达一下您的问题:我应该传输加密的信息吗?是的,没有理由不这样做(除非您懒惰地学习如何做)。使用HTTPS将确保机密性和完整性(没有人弄乱您的数据,您说的是正确的服务器)。 HTTPS今天开始可用。甚至还有免费的证书颁发机构服务(例如letsencrypt.org)。
存储密码时,最好的选择是使用慢速加密散列(是的,bcrypt可以完成此工作)。散列通常发生在服务器端。
我应该在客户端加密信息吗?通常这不是最好的主意。问题是-您能够合理地管理加密密钥吗?确保数据完整性?确保服务器的身份?限制旁道攻击的选择? TLS为您完成了所有工作。当已经有了不错的充气橡胶轮胎时,您将重新发明石轮。
如果我应该在传输之前麻烦加密客户端上的信息,那么这样做的最佳客户端加密库是什么(在React上下文中,如果有所作为)。
我使用CryptoJS库进行JS加密(我在服务器端使用了它,但我相信这没有关系)。
此外,我将如何向客户端发送加密的服务器信息,客户端使用与bcrypt不同的技术对其进行解密;或者,我应该完全使用客户端加密,而服务器只是在不知道其内容的情况下读写加密信息。
只需-使用TLS(HTTPS)。在某些时候,您需要信任您的服务器。实际上,您仍然应该保护数据(例如拥有密码)
您可以构建自己的加密通信协议(没有人可以阻止您),但是这将花费您很多时间,并且其安全性仍然非常可疑(礼貌地说)。