我一直在阅读PAKE协议,特别是从SRP RFC2945开始。
服务器上需求的要点是服务器将三胞胎(username, verifier (v), salt (s))保存在凭据表中。
其中验证器v = g^x % N ( ^运算符是指数运算)和x = SHA(<salt> | SHA(<username> | ":" | <raw password>))
现在,在身份验证过程中,客户端从服务器获得salt (s),并计算服务器正在使用的相同的verifier (v)。它可以计算这个值,因为它从用户自身收集username和password。
在接下来的几个步骤中,客户端可以从服务器中减去组件v,挑战B = (v + g^b) % N并得到从S派生的密钥。
客户端:S = (B - g^x) ^ (a + u * x) % N
我的问题是,如果有人侵入我的数据库并使用(username, verifier (v), salt (s))转储凭据表,他们就可以立即访问每个用户名的所有验证器。那么,是什么阻止他们使用获得的验证器来模仿客户端并完成客户端身份验证步骤呢?因此,与从实际的verifier (v)和password中计算username不同,他们可以简单地使用恶意从服务器获得的验证器来继续客户端的计算,并得到与服务器相同的密钥。
也就是说,在我的推理中,如果我的服务器被黑客攻击并且凭据被泄露,那么最终的结果并不比我保存纯文本密码好多少。
免责声明:我承认我不完全理解数学,但一般认为这类密码协议依赖于(g^a)^b = (g^b)^a = g^ab指数的特性。
发布于 2020-05-20 20:26:53
即使攻击者破坏服务器数据库,并获得客户端的用户if (u)、验证器(v)和salt (s),攻击者也无法使用此信息作为该客户端登录。
见https://en.wikipedia.org/wiki/Secure_远程_密码_协议。第4步是客户端计算客户端会话密钥的地方,如下所示:
S_c = pow(B - k * pow(g, x, N), a + u * x, N) [eq 1]验证者以前是按以下方式计算的:
v = pow(g, x, N) [eq 2]因此,攻击者知道验证器后,可以将eq 1重写为:
S_c = pow(B - k * v, a + u * x, N) [eq 3]B以前是从服务器发送的,k和N是双方都知道的常数,a是在客户端计算的,客户端有他所需的一切计算u,v是从服务器那里得到的,但是x呢?在计算客户端会话密钥之前,客户端必须首先按以下方式计算x:
x = H(s, I, p) [eq 4]如果S是salt (从漏洞中的服务器获得),我是用户id (也是从服务器获得的),而p是密码。
没有密码,攻击者无法计算x,因此攻击者无法计算会话密钥。没有会话密钥,客户端就无法与服务器进行身份验证。因此,了解u、v和S对于客户端的攻击者登录是不够的。攻击者还必须知道x,x是根据密码计算的。
但是,x等同于明文密码。这就是客户机不应该存储x的原因。
https://security.stackexchange.com/questions/231958
复制相似问题