我在创建一个基于套接字的 Web 应用程序时,解决这个问题的方法是,在连接到客户端时,服务器生成一个 salt (在散列之前添加的随机字符串)并将其存储在套接字变量中,然后将这个散列传输给客户端。客户端获取用户密码,对其进行哈希处理,添加服务器上的 salt 并对整个过程进行哈希处理,然后再将其传输到服务器。然后它被发送到服务器,服务器将这个 hash 与 hash (DB + salt 中的 hash)进行比较。据我所知,这是一个很好的方法,但公平地说,我没有读过很多关于这个主题,如果我错了,我希望得到纠正:)
如果有人能够以某种方式从数据库中读取密码(这确实会发生,想想 SQL 注入) ,他们仍然无法通过我的 API 执行模拟用户的特权操作。这是因为散列不对称; 即使他们知道存储在数据库中的散列,他们也不会知道用于创建它的原始密钥,而这正是您的 auth 中间件用来进行身份验证的。这也是为什么您应该总是在散列存储器中加盐。
当然,如果他们可以自由地从您的数据库中读取他们想要读取的内容,那么他们可能会造成很多其他的损害。
我只是想在这里强调一下,如果你决定在离开你的客户端之前对密钥进行哈希,那是不够的——后端哈希更加重要,这就是为什么: 如果有人从你的客户端拦截流量,那么他们会看到 password字段的内容。无论这是散列还是纯文本,这都无关紧要——他们可以逐字复制它来模拟授权客户机。(除非您按照@user3299591所列出的步骤进行操作,我建议您这样做)。另一方面,对 DB 列进行哈希处理是必要的,并且一点也不难实现。