1

所以我有一个应用程序,我希望用户能够在离线时使用。所以在线时会有密码,当用户离线时我会使用相同的密码。

它不是一个超级隐私敏感的应用程序,但我仍然宁愿不将整个散列加盐密码存储在本地磁盘上。所以我在想,我只是对密码进行哈希处理,并将结果哈希的前 4 位存储在磁盘上。这样,用户仍然在线或离线输入相同的密码。

这是一个好主意还是我被严重误导了?

4

2 回答 2

1

当您在本地存储密码的哈希时没有任何问题,只需确保您需要像 BCrypt 这样的慢速密钥派生函数来创建哈希。

不必通过 Internet 传输哈希值,可能的过程如下所示:

  1. 用户第一次输入他的密码。
  2. 我们使用唯一的盐和高成本因素在本地对密码进行哈希处理,并将其存储在本地。
  3. 我们将原始密码传输到服务器。
  4. 服务器使用另一个唯一盐和正常成本因子对密码进行哈希处理,并将其存储在数据库中。

这样,本地密码哈希看起来与服务器密码哈希不同,您不会透露任何有关服务器密码哈希的信息。由于成本因素较高,暴力破解本地密码需要更多时间。由于无论如何您都想在本地存储某些内容,因此最好存储一个安全的散列,而不是散列的不安全部分。

于 2013-04-05T15:19:43.507 回答
1

通常,此功能是一个坏主意。攻击者甚至不需要 SQL 注入来破坏密码哈希。

如果您存储生成的哈希的前 4 位数字,那么您可能会产生大量可能的密码。基数 16 的 4 位数字是 16^4 或只有 65536 个密码,或者换一种说法,它总是需要不超过 65536 次猜测才能获得一些正确的密码......这是非常不安全的。

加密文件系统也有类似的问题。他们必须能够验证密码,并且他们希望防止离线暴力破解。他们通常使用密钥拉伸,使用 bcrypt、scrypt 甚至 pbkdf2 来消耗相当数量的 ram 和 CPU 以验证密码是否正确。几千轮的 bcrypt 应该足以防止大多数离线攻击。

于 2013-04-05T15:15:51.470 回答