【发布时间】:2015-12-23 08:52:17
【问题描述】:
我读过这篇文章:
https://crackstation.net/hashing-security.htm
据说在web应用程序中,总是需要在服务器中对密码进行hash,以确保hash正确。但是如果客户端对密码进行哈希处理并发送给服务器,服务器要做的是对密码进行哈希处理,那么如果服务器从客户端接收到的是哈希密码,服务器如何对密码进行哈希处理呢?
我的另一个疑问是需要执行的基本步骤:
- 从数据库中检索用户的盐和哈希。
- 将盐添加到给定密码并使用相同的哈希函数对其进行哈希处理。
- 将给定密码的哈希值与数据库中的哈希值进行比较。如果它们匹配,则密码正确。否则密码不正确。
好吧,服务器从客户端获取密码,将盐与客户端密码一起使用,对其进行哈希处理并与数据库中的哈希密码进行比较。好吧,这个用户的盐总是相同的,它是从数据库中获取的,如果中间人得到密码,可以使用这个密码并在数据库中进行身份验证,因为服务器将使用盐并获得相同的哈希密码.所以不管是真实用户还是中间人,服务器都允许访问。
另一种选择是,如果服务器收到散列密码,它只需要从数据库中获取散列,因此它避免散列,节省资源。然后客户端而不是发送密码,而是发送散列密码,服务器将来自客户端的散列密码与数据库的散列进行比较。在这里,中间人也可以获得散列密码并使用它进行身份验证。最后,如果用户发送密码是一样的。
我没有看到加盐和散列密码的好处,因为如果中间人攻击连接,他可以在数据库中进行身份验证。所以我认为重要的是确保连接是安全的,然后以明文形式发送密码也是如此,因为连接是安全的。但也许我不明白一些事情,因为我知道加盐和散列密码是一种常见的做法。
如果一个攻击者可以访问数据库,我看到散列密码的唯一真正好处是,因为他无法从散列密码中获取密码,但是如果攻击者访问数据库,他可以访问所有信息,所以我猜不太重要的数据是密码。
出于这个原因,我想知道,安全连接还不够吗?因为如果攻击者可以访问连接,那么他可以访问密码并可以在服务器中进行身份验证。如果攻击者无法访问连接,那么为什么要在服务器中散列密码?散列密码是浪费资源,因为这是一个艰难的过程。
谢谢。
【问题讨论】:
标签: security