【问题标题】:Safely storing a password locally在本地安全地存储密码
【发布时间】:2017-03-23 03:18:17
【问题描述】:

我正在用 C 语言编写一个程序,允许用户注册和登录。当用户注册时,我想将他的用户名和密码保存在一个文件中。

据我了解,这样做的最佳方法是在密码末尾添加一个随机加盐,然后存储加盐密码的安全哈希(例如 SHA-1)。

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

【问题讨论】:

  • 如果攻击者已经拥有该级别的访问权限,那么当他们可以直接提取所需的所有数据时,为什么还要登录?
  • 这正是我想要阻止的。如何防止攻击者访问本地存储的数据?
  • 我认为一种可能性是加密您的文本文件。尽管如此,你的二进制程序还是有如何解密它的信息,所以攻击者也不是不可能弄清楚,但如果你把事情弄得足够模糊,那就真的很难了。

标签: c security hash passwords


【解决方案1】:

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

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

  1. 然后,您的应用程序将包含一个秘密的强密钥,并使用此密钥计算散列的 HMAC。
  2. 此 HMAC 可以与密码哈希一起存储在文件中。
  3. 在读取哈希进行验证时,软件会再次计算 HMAC,并可以将其与存储的 HMAC 进行比较。

只要攻击者不知道您应用程序中的密钥,他就无法为自己的哈希生成正确的 HMAC。所以我们得到的是,密码文件不能被更改,而是由您的应用程序,安全性集中在您的应用程序的密钥中。加密/解密密码文件也可以达到同样的效果。

附注请不要使用 SHA- 来存储密码,而是使用具有成本因子的哈希函数,例如 BCrypt、PBKDF2 或 SCrypt。*

【讨论】:

    【解决方案2】:

    您似乎只有一个服务器,它承载应用程序,还有用户名和散列密码。在这种配置中,没有完美的保护措施来防止攻击者成为 root。

    不过,你可以尝试一些好的功能:

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

    【讨论】:

      猜你喜欢
      • 2013-06-02
      • 2015-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-23
      • 1970-01-01
      • 1970-01-01
      • 2018-05-13
      相关资源
      最近更新 更多