【问题标题】:Integrity of the application password [duplicate]应用程序密码的完整性[重复]
【发布时间】:2016-06-12 22:36:35
【问题描述】:

有谁知道如何将密码安全地存储在文本文件中。我在 VS 中有一个带有登录窗口的 C# 本地应用程序,我需要存储用户密码。我知道散列和加密,但问题是任何人都可以删除密码文件或更改其中的数据。有没有办法解决这个问题?我的攻击者模型是具有管理员权限的用户。

谢谢大家!我已经通过运行一个保持文件打开的服务解决了这个问题,所以除非你关闭服务,否则你不能编辑或删除它。这不是我认为的最佳解决方案,但它确实有效。

【问题讨论】:

  • 加密它们并将它们存储在数据库中存储在文件中在我看来不是很安全..
  • 你不能......你不能控制用户将如何处理他们系统上的文件。
  • 您不能信任攻击者可以修改的数据。您的威胁模型是什么?
  • @MethodMan 您将在哪里存储加密密钥?
  • 将密码保存在数据库中是一个非常糟糕的主意,至少将它们保存为加盐和散列。

标签: c# visual-studio security password-protection


【解决方案1】:

正如其他人所说,这取决于您的威胁模型。如果本地存储的密码将用于验证任何内容,则需要对其进行加密,并存储在加密的数据库/文件中。

您是否在本地存储此密码以保存远程登录的用户密码?

或者您是否存储此密码以实际验证用户登录数据? (通常您不想这样做,因为正如其他人所说,您不能信任用户端的文件。)

最好的解决方案是使用远程服务器来存储密码,同时验证登录数据。

但是..

没有一种适合所有安全模型的尺寸。这取决于您的需求、用户需求、您提供的服务类型,以及相应的应用程序所需的安全级别。 (MSN 聊天帐户不需要与银行登录相同的安全性。

您最初的问题是如何防止用户编辑本地密码文件:

您需要在保存文件时对其进行加密。 (也使用 sha256 对存储的密码进行哈希处理,使用盐)

然后在您的应用程序中解密密码文件(在内存中),然后从中读取密码哈希以在您的应用程序中使用。除此之外,您可以远程存储文件/密码的解密密钥/盐。您的应用需要访问互联网才能获取密钥/盐,然后解密本地文件/密码。

更多阅读和代码参考:

Encrypting Files in C-Sharp

Sha256 Hashing with Salt in C-Sharp

Using Remote SQL Databases in C-Sharp

【讨论】:

  • 1.您会将加密文件的加密密钥保存在哪里?这移动了秘密,但确实增加了工作因素。 2.“你不能信任用户端的文件”,但你也不能信任服务器端的文件!服务器至少需要对第二个因素进行良好控制的双因素身份验证。
  • 这取决于应用程序的安全级别。对于非常安全的事情,您永远不应该在本地存储任何密码数据。如果安全性没有被优先考虑,您可以将(加密密码)作为(加密字符串)存储在(加密文件中。)将(解密本地文件和密码的密钥)存储为应用程序内部的静态字符串. (这很容易被拆卸。)但是,嘿,这个应用程序不是银行账户,对吧?
  • 我同意增加工作系数。在某些平台上,拆卸只能通过越狱设备、安装黑客工具、执行应用程序和检查内存中的代码来完成。
  • 随意提出替代方案。我不是安全专家。只是一个程序员。 :)
  • 我并不反对。安全性就是增加工作因素。代码嵌入的密钥可能很难访问。
【解决方案2】:

扩展 zaph 评论:使用散列。

通过良好的哈希函数 (SHA2) 运行用户密码并存储哈希。

当用户输入密码并且你想检查它时,通过相同的哈希函数运行他们的输入,看看你是否得到相同的哈希。

这样更安全,因为您没有存储可以转换回密码和被盗的东西

【讨论】:

  • 几乎,但不要使用散列函数,使用 HMAC 或更好的 PBKLDF2 或 bcrypt。如果您可以将盐保密(或至少使其难以获取),攻击者将很难替换文件中的条目。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-26
相关资源
最近更新 更多