在本地安全地存储密码

时间:2016-11-09 10:32:45

标签: c security hash passwords

我在C中创建一个允许用户注册和登录的程序。当用户注册时我想将他的用户名和密码保存在文件中。

据我所知,最好的方法是在密码末尾添加一个随机盐,然后存储盐渍密码的安全散列(例如SHA-1)。

我的问题是:如果我在本地存储文本文件中的用户名,哈希值和盐,那么是什么阻止攻击者只用他自己的盐将文件中的哈希和盐更改为他自己的SHA-1哈希,然后使用他的登录新密码?
感谢。

2 个答案:

答案 0 :(得分:1)

您似乎只有一台服务器,它托管应用程序,还有用户名和哈希密码。在此配置中,没有针对攻击者为root的完美保护。

但是,您可以尝试使用一些好的功能:

  • 散列密码使攻击者难以获取密码并使用具有用户凭据的应用程序
  • 但是,攻击者确实可以更改哈希值。为了防止这种情况,您可以尝试通过以下方式保护该文件:
    • 检测与远程副本相比的变化
    • 或在其上使用签名:基本上,只允许您的应用程序更新密码。您可以在应用程序中使用密钥,用于对文件进行签名,并在最后添加签名。当应用程序读取文件进行身份验证时,它可以检查文件是否已损坏。攻击者可能很难获得该签名机制,但当然也没有什么不可能。

答案 1 :(得分:1)

这取决于攻击者是否只能访问此密码文件,或者他是否也可以访问可执行文件。在后一种情况下,你只能更难以交换哈希值,但你不能完全阻止它。

对于第一种情况,on可以使用HMAC来验证存储的哈希值:

  1. 您的应用程序将包含一个密钥强密钥,并使用此密钥计算哈希的HMAC。
  2. 此HMAC可以与密码哈希一起存储在文件中。
  3. 当读取哈希值进行验证时,软件会再次计算HMAC并将其与存储的HMAC进行比较。
  4. 攻击者无法为自己的哈希生成正确的HMAC,只要他不知道您的应用程序中的密钥即可。所以我们得到的是,密码文件不能被改变,但是你的应用程序,安全性集中在你的应用程序的密钥。加密/解密密码文件也可以达到同样的效果。

    P.S。请不要使用SHA - 来存储密码,而是使用带有BCrypt,PBKDF2或SCrypt等成本因子的哈希函数。*