在C#中将密码安全地存储在应用程序中

时间:2018-10-27 19:04:29

标签: c# security passwords

我创建了一个程序以在其中导入敏感信息。 为防止其他人 访问该应用,我需要密码才能登录该应用。

如果我在字符串中输入密码,将很容易看到并且没有安全性。 我查看了几个站点,但没有找到好的答案。

什么是密码保护方法?

谢谢。

3 个答案:

答案 0 :(得分:1)

如今的趋势是使用诸如Auth0之类的第三方服务来处理身份验证和授权,这样,密码就永远不会直接存储在应用程序的数据库中:https://auth0.com/

如果您采用将密码存储在自己的数据库中的方法,最简单的方法是使用单向哈希算法(例如md5,SHA256或Bcrypt)来哈希插入中的密码。我不知道C#生态系统中具体有哪些库,但让我们假设您引入了一个名为bcrypt的库,并假设您已实例化了它。在您的控制器方法中,您可能会看到以下内容:

var user = new User
    {
        name = input.name,
        password = bcrypt(input.password)
    };

_context.Add(user);
await _context.SaveChangesAsync();

这是一种安全地存储密码的原始方法,但是比以纯文本格式存储密码要好。如果您关心安全性,则值得对散列和加盐密码主题进行更多研究。

无论哪种方式,这里发生的事情都是通过单向哈希发送纯文本密码,这意味着加密的文本不能被反向。这意味着您的应用程序永远不知道用户的密码实际上是什么。

对用户进行身份验证的方法是,将登录时输入的密码的哈希版本与数据库中的密码(通过相同的哈希功能)进行比较。如果两个字符串匹配,则用户输入了正确的密码。

现在,大多数应用程序通常都有一些需要设置的系统管理员用户。我处理此问题的方法是为数据库创建一个种子机,该种子机使用一个我在某些配置文件(例如.env)中设置为环境变量的凭据来创建用户。

.env可能类似于:

ADMIN_USER_NAME=admin
ADMIN_USER_PASSWORD=password

播种者将使用这些值并插入具有系统管理员所需角色和权限的用户。

.env本身从未被检入版本控制,并且生产凭证仅存在于生产环境中(您将在开发环境中创建虚拟凭证)。

假定播种机只能由有权直接访问生产环境的人员运行,这是设置初始系统管理员用户的一种非常安全的方法,该用户的密码也像其他用户一样被散列,因此您仍然不用万一发生违规,原始数据凭证就不会放在您的数据库中。

答案 1 :(得分:0)

如果此问题是关于如何隐藏键入的字符以免被看到,只需将文本字段的PasswordChar设置为“ *”作为示例。

答案 2 :(得分:0)

您可以使用内置的SecureString,它将加密的基础信息存储在内存中。如果使用WPF,则有一个密码框控件,该控件也将密码存储在SecureString中。