Tho*_*nin 12
如果客户端只发送散列密码,则散列密码是 "密码":客户端只需要显示以进行身份验证的字节序列.如果攻击者可以嗅探那么你的协议注定失败了.
如果身份验证协议只包含一个秘密数据(如果您愿意,可以将其称为密码),那么交换应该在传输介质中进行,以确保机密性(以便秘密数据无法被嗅探)和服务器身份验证(所以攻击者可能无法模仿服务器并说服客户端向他发送秘密数据.这是您从经典的SSL/TLS隧道(https://Web上下文中的URL)中获得的.
如果您无法使用服务器身份验证建立SSL/TLS隧道(即服务器具有客户端可以验证的证书),那么您可能需要采用带有质询的身份验证协议:服务器发送一系列随机字节(挑战)并且客户端使用通过密码和挑战的串联计算的哈希值进行响应.不要在家尝试做这个!要做到这一点非常困难,特别是当攻击者可以拦截通信(主动攻击)时.
更通用的答案是密码验证的密钥交换协议.PAKE结合了加密密钥协商协议(如Diffie-Hellman)和客户端与服务器之间的相互密码身份验证,即使密码相对较弱,攻击者也无法获得足够的数据来"尝试"密码,无需与客户端或服务器进行每次猜测的交互).不幸的是,很少有PAKE算法已经标准化,超出了数学描述,该领域是一个专利雷区.