challenge/response 无需 HTTPS(无需发送密码)即可通过服务器进行安全身份验证的方法是什么?

What is the challenge/response method to securely authenticate with a Server without HTTPS (without sending out password)?

什么是 challenge/response 在没有 HTTPS 的情况下使用服务器进行安全身份验证(不发送密码)的方法?

我有一个应用程序(Javascript 客户端)通过 CORS(身份验证)连接到我们的后端,后者又将 return 一个包含声明(JWT)的令牌 non-HTTPS . REST 是无状态的,所以我们 token-based 而根本没有 session。

当客户端获得该令牌(包含声明)时,它会添加到客户端的每个请求的 header 中,因此后端知道哪个用户 ID 正在执行该请求并执行适当的操作。到目前为止,这对我们有用。我关心的是身份验证过程和每个请求的安全性。

为了验证客户端发送的电子邮件和散列密码对,但是我想知道是否有更安全的方法,即使现在不使用 HTTPS。我已经阅读到不发送密码而是做一个challenge/response,但是这个想法的实现是什么?

最后一个问题是,即使我们安全地绕过了身份验证过程,每个包含带有声明的令牌的请求也能得到保护吗?

如果没有 HTTPS,无法安全地执行此操作。对于您的服务器来验证用户,您需要某种令牌(cookie,像您一样添加到请求等)但是,问题是,如果没有 https,窃听者可以将 javascript 添加到您的页面。然后他们可以捕获令牌并自己使用它(窃取所有用户的数据),或修改它。如果您希望您的产品以任何方式安全,则需要 HTTPS。

编辑:我猜你可以存储一些关于发送请求的设备的信息(用户代理等),并且只允许在该设备上使用令牌。但是,攻击者可以在重用令牌时伪造用户代理,因此绕过它并不难。

挑战响应是一种以非明文方式发送密码的机制。

1°/ 客户端和服务器必须共享一个加密密钥:最好是在客户端上手动添加证书,但可能有点重。另一种解决方案是将密钥仅存储一次到 localStorage。

2°/ 客户端向服务器请求挑战:这是由服务器

生成的"phrase"

3°/ 客户端将其密码与此 "passphrase" 相结合,并向服务器发送响应:Challenge => Response

4°/服务器解密消息,搜索并删除其密码短语以获取密码。