所以我有一个应用程序,我希望用户能够在离线时使用。所以在线时会有密码,当用户离线时我会使用相同的密码。
它不是一个超级隐私敏感的应用程序,但我仍然宁愿不将整个散列加盐密码存储在本地磁盘上。所以我在想,我只是对密码进行哈希处理,并将结果哈希的前 4 位存储在磁盘上。这样,用户仍然在线或离线输入相同的密码。
这是一个好主意还是我被严重误导了?
当您在本地存储密码的哈希时没有任何问题,只需确保您需要像 BCrypt 这样的慢速密钥派生函数来创建哈希。
不必通过 Internet 传输哈希值,可能的过程如下所示:
这样,本地密码哈希看起来与服务器密码哈希不同,您不会透露任何有关服务器密码哈希的信息。由于成本因素较高,暴力破解本地密码需要更多时间。由于无论如何您都想在本地存储某些内容,因此最好存储一个安全的散列,而不是散列的不安全部分。
通常,此功能是一个坏主意。攻击者甚至不需要 SQL 注入来破坏密码哈希。
如果您存储生成的哈希的前 4 位数字,那么您可能会产生大量可能的密码。基数 16 的 4 位数字是 16^4 或只有 65536 个密码,或者换一种说法,它总是需要不超过 65536 次猜测才能获得一些正确的密码......这是非常不安全的。
加密文件系统也有类似的问题。他们必须能够验证密码,并且他们希望防止离线暴力破解。他们通常使用密钥拉伸,使用 bcrypt、scrypt 甚至 pbkdf2 来消耗相当数量的 ram 和 CPU 以验证密码是否正确。几千轮的 bcrypt 应该足以防止大多数离线攻击。