在发送到服务器之前散列密码

son*_*876 5 sql sockets security passwords hash

通过UTF-8编码套接字传输发送密码时,如果在发送数据之前使用MD5或SHA-1散列密码,它是否安全?请记住,我计划比较SQL数据库中的散列密码.我担心有人能够在UTF-8中嗅探哈希密码,然后解密UTF-8编码并获得我的哈希密码,这可能用于匹配我的数据库中的密码.

Tho*_*nin 12

如果客户端只发送散列密码,则散列密码 "密码":客户端只需要显示以进行身份​​验证的字节序列.如果攻击者可以嗅探那么你的协议注定失败了.

如果身份验证协议只包含一个秘密数据(如果您愿意,可以将其称为密码),那么交换应该在传输介质中进行,以确保机密性(以便秘密数据无法被嗅探)和服务器身份验证(所以攻击者可能无法模仿服务器并说服客户端向他发送秘密数据.这是您从经典的SSL/TLS隧道(https://Web上下文中的URL)中获得的.

如果您无法使用服务器身份验证建立SSL/TLS隧道(即服务器具有客户端可以验证的证书),那么您可能需要采用带有质询的身份验证协议:服务器发送一系列随机字节(挑战)并且客户端使用通过密码和挑战的串联计算的哈希值进行响应.不要在家尝试做这个!要做到这一点非常困难,特别是当攻击者可以拦截通信(主动攻击)时.

更通用的答案是密码验证的密钥交换协议.PAKE结合了加密密钥协商协议(如Diffie-Hellman)和客户端与服务器之间的相互密码身份验证,即使密码相对较弱,攻击者也无法获得足够的数据来"尝试"密码,无需与客户端或服务器进行每次猜测的交互).不幸的是,很少有PAKE算法已经标准化,超出了数学描述,该领域是一个专利雷区.