Security 使用HMAC传输密码是否正常?

Security 使用HMAC传输密码是否正常?,security,hmac,Security,Hmac,我正在写一个小的网络应用程序,我不想以明文形式传输登录密码。由于没有可用的SSL,我编写了一个一次性质询系统,该系统发送一个带有登录表单的随机字符串,然后用于在客户端使用HMAC-SHA256散列密码。我使用随机质询字符串作为消息,用户密码作为HMAC的密钥 我知道自制解决方案通常是个坏主意,所以我想问一下我是否犯了错误。要做到这一点,您需要某种方式将服务器发送的随机字符串与发送到的客户端链接起来,否则,攻击者只需将哈希密码和随机字符串发送回服务器即可获得访问权限 但是,如果将随机字符串存储在某

我正在写一个小的网络应用程序,我不想以明文形式传输登录密码。由于没有可用的SSL,我编写了一个一次性质询系统,该系统发送一个带有登录表单的随机字符串,然后用于在客户端使用HMAC-SHA256散列密码。我使用随机质询字符串作为消息,用户密码作为HMAC的密钥


我知道自制解决方案通常是个坏主意,所以我想问一下我是否犯了错误。

要做到这一点,您需要某种方式将服务器发送的随机字符串与发送到的客户端链接起来,否则,攻击者只需将哈希密码和随机字符串发送回服务器即可获得访问权限

但是,如果将随机字符串存储在某种服务器会话中,那么打开会话欺骗作为可能的攻击向量。


您的解决方案比以明文形式发送密码要好,因为攻击者将无法发现用户的密码,但他们仍然可以冒充用户。

我认为这不是一个可接受的解决方案

HMAC的目的是验证数据的完整性和真实性。因此,您可以使用它来验证信息是否没有更改,也可以使用它来验证用户是否拥有密钥(在您的情况下是密码)

它不能做的是SSL可以做的其他一些事情,比如通过加密通道和为最终用户验证服务器的身份来防止屋檐掉落

窃听:没有什么可以阻止中间人(MITM)监视此事务、拦截返回响应(HMAC摘要)并将其作为自己的请求发送(甚至停止其他用户的响应)

验证服务器ID:此处缺少的最重要的部分之一是保护用户不被钓鱼者欺骗。使用有效的SSL证书,您的用户无法验证该站点是您的还是冒名顶替者。您试图通过验证最终用户的真实性来保护自己,这很好,但您忘记了保护最终用户


我很想知道你为什么没有可用的SSL。我听了很多,发现通常的原因是因为有人不想为证书支付50美元。但是证书是值得的,在一个安全性很重要的环境中,SSL不可用真的不应该有任何技术原因

这可能是一个更好的问题,我知道我不能用它来代替SSL,我也不打算这么做。我的问题是,我是否正确使用HMAC。例如,我的第一个版本使用用户密码作为消息,质询字符串作为密钥(因为我认为我要发送到服务器的消息是用户密码)。但后来我注意到挑战字符串并不完全是一个秘密,所以我切换了它。我遇到的大多数类似的解决方案都是写
HMAC(密码,挑战)
,我不确定哪个应该是消息,哪个密钥。至于SSL,我的服务器只有一个IP,这个IP已经在另一个站点上使用SSL。到目前为止,我还不知道有什么好的解决方案可以针对每个域而不是IP使用证书。SNI很好,但它不能与IE/XP一起工作,IE/XP仍然很常见。UC证书将是我所知道的唯一解决方案,但这些证书的价格远远超过50美元,即使这样也不理想。根据我的经验,让托管提供商添加IP地址是一件小事。我的专用服务器有5台,我的VPS有1台,增加额外的IP大约是每月1-2美元。