我正在开发一个程序,需要用户登录。交通是不敏感的,但必须尽快旅行,因此,我不是通过TLS或其他的安全连接。唯一敏感的是密码,可能是用户名(这将是电子邮件地址)。我考虑过在传输密码之前先在客户端散列密码,或者用RSA公钥对密码进行加密,问题是,如果攻击者能够获得这个哈希或加密密码,如果他修改客户端,他可以很容易地直接使用这个哈希登录,所以我需要一些盐析。问题是:服务器将存储经过盐渍+散列的密码,因此当客户端每次使用不同的盐分哈希密码时,它将产生不同的哈希。通过加密,服务器只需解密password+salt并剥离salt即可。现在,我想知道是否有一种不用加密,只使用散列的方式,可以安全地将密码传输到服务器,并禁止攻击者只重用哈希密码?
我的想法:
服务器存储用salt1加密的密码,哈希。服务器向客户端发送salt1和一个随机(每个连接都是一个新的) salt2。客户端盐类和哈希密码使用salt1,盐类和散列步骤1中的哈希值再次与salt2一起发送给服务器。因此,要检查密码,服务器必须对其进行盐分和散列,然后使用salt2存储散列,并检查是否相等。这安全吗?
发布于 2016-08-16 22:31:21
您可以使用与HTTP摘要身份验证相同的技术(实际上,您可以使用该技术,重用几个现有库中的任何一个)。
服务器发送一个问题,客户端回答(例如)把挑战和秘密混为一谈。服务器注意不要重复使用一个挑战。
根据连接的机制,您可能需要在每次请求时重新验证连接。为了减少开销,您可能需要使用某种增量的nonce,即
client server
login request ------> user's password is "squeamishossifrage"
<--- 12345 challenge
hash (MD5("12345:0:squeamishossifrage")
<--- OK ---
---> MD5("12345:1:squeamishossifrage")使用HTTP与Digest-8月,这是自动完成的。使用普通HTTP,您可以简单地向每个请求添加一个标头或参数。
服务器存储用salt1加密的密码,哈希。服务器向客户端发送salt1和一个随机(每个连接都是一个新的) salt2。客户端使用salt1对密码进行盐类和散列,使用salt2再次对步骤1中的哈希进行哈希,将此哈希发送到服务器。因此,要检查密码,服务器必须对其进行盐分和散列,然后使用salt2存储散列,并检查是否相等。
这是可以的,但它等同于将密码存储在清除文件中。从所有意图和目的来看,知道salt1-ed密码就足以成功登录;这意味着,如果要访问密码数据库,他可以按原样使用它,而不需要任何解密。
与将密码存储在空中相比,您确实有一个优势,这就是这样您不必担心密码的重用(即用户使用与他的密码相同的密码用于其他服务。任何访问您的数据库的人都可以访问此其他服务)。
https://security.stackexchange.com/questions/134074
复制相似问题