在线时远程密码,离线时为本地密码

时间:2013-04-05 08:39:24

标签: security passwords

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

这不是一个超级隐私敏感的应用程序,但我仍然不会在磁盘上本地存储整个哈希盐渍密码。所以我想,我只是哈希密码并在磁盘上存储生成的哈希的前4位数字。这样,用户仍然可以在线或离线输入相同的密码。

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

2 个答案:

答案 0 :(得分:1)

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

如果存储结果哈希的前4位数字,则可能会产生大量可能的密码。基数16的4位数是16 ^ 4或只有65536个密码,或换句话说它总是需要不超过65536次猜测来获得一些正确的密码......这是可怕的不安全

加密文件系统也存在类似问题。他们必须能够验证密码,并且他们希望防止脱机暴力。他们通常使用键拉伸,使用bcrypt,scrypt甚至pbkdf2来花费相当数量的RAM和CPU来验证密码是否正确。几千轮的bcrypt应足以防止大多数脱机攻击。

答案 1 :(得分:1)

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

没有必要通过互联网传输哈希值,可能的过程可能如下:

  1. 用户第一次输入密码。
  2. 我们使用唯一的salt和高成本因子在本地哈希密码,并将其存储在本地。
  3. 我们将原始密码传输到服务器。
  4. 服务器使用另一个唯一的盐和正常的成本因子对密码进行哈希处理,并将其存储在数据库中。
  5. 这样本地密码哈希看起来与服务器密码哈希不同,你没有透露有关服务器密码哈希的任何信息。由于成本因素较高,暴力破解本地密码需要更多时间。既然你想在本地存储一些东西,最好存储一个安全的哈希,而不是哈希的不安全部分。