我正在编写一个小型的webapp,我不想将登录密码作为明文传输。因为我没有可用的SSL,所以我写了一个一次性挑战系统,它使用登录表单发送随机字符串,然后在客户端使用HMAC-SHA256对密码进行哈希处理。我使用随机挑战字符串作为消息,并使用用户密码作为HMAC的密钥。
我知道自制的解决方案通常是一个坏主意,所以我想问一下我是否在这里犯了错误。
答案 0 :(得分:1)
我不相信这是一个可以接受的解决方案。
HMAC的目的是验证数据的完整性和真实性。因此,您可以使用它来验证信息是否未更改,您可以使用它来验证用户是否具有密钥(在您的情况下,密码)。
它不能做的是SSL可以做的其他一些事情,比如通过加密频道和为最终用户验证服务器的身份来防止掉落。
窃听:没有什么可以阻止中间人(MITM)观看此交易,拦截返回响应(HMAC摘要)并根据自己的请求发送(甚至停止响应其他用户)。
验证服务器的ID:您在此处缺少的最重要的部分之一是保护您的用户不被网络钓鱼者欺骗。使用有效的SSL证书,您的用户无法验证该网站是您的还是冒名顶替者。您试图通过验证最终用户的真实性来保护自己,这很棒,但您忘记保护最终用户。
我很想知道为什么你没有SSL。我听到了很多,并且发现通常的原因是因为有人不想为证书支付50美元。但是证书是值得的,并且在安全性很重要的环境中,确实不应该有任何技术原因导致SSL无法使用。
答案 1 :(得分:0)
为此,您需要某种方式将服务器发送的随机字符串与发送给它的客户端链接起来,否则攻击者只需将散列密码和随机字符串发送回服务器即可获取访问权限
但是,如果将随机字符串存储在某种服务器会话中,则会将会话欺骗打开为可能的攻击媒介。
您的解决方案比以纯文本方式发送密码更好,因为攻击者无法发现用户的密码,但他们仍然可以作为用户。