我正在从事一个必须具有身份验证(用户名和密码)的项目

它还连接到一个数据库,所以我想我应该把用户名和密码存储在那里。但是,如果密码只是数据库表中的一个文本字段,这似乎不是一个好主意。

我使用c#并连接到2008年的快速服务器。谁能建议(用尽可能多的例子)存储这类数据的最佳方法是什么?

附:如果有一个好的理由,我可以接受这个信息不存储在数据库中的想法


当前回答

背景 你从来没有……真的……需要知道用户的密码。您只是想验证输入的用户知道某个帐户的密码。

散列: 通过强哈希函数存储哈希(单向加密)的用户密码。 搜索“c#加密密码”会给出大量的例子。

查看在线SHA1哈希创建者,了解哈希函数产生的内容(但不要使用SHA1作为哈希函数,使用更强的函数,如SHA256)。

现在,散列密码意味着您(和数据库窃贼)不应该能够将散列反转回原始密码。

如何使用: 但是,如何使用存储在数据库中的这个混合密码呢?

当用户登录时,他们会给你用户名和密码(在原始文本中) 您只需使用相同的哈希代码来哈希输入的密码以获得存储的版本。

因此,比较两个散列密码(用户名的数据库散列和输入的&散列密码)。您可以通过比较他们的散列来判断“他们输入的内容”是否与“原始用户输入的密码”相匹配。

额外学分:

问:如果我有你的数据库,难道我不能像开膛手约翰一样,开始进行哈希,直到找到与你存储的哈希密码匹配的密码吗? (因为用户选择了简短的字典单词……这应该很容易)

答案:是的……是的,他们可以。

所以,你应该“盐”你的密码。 参见维基百科关于盐的文章

参见“如何使用salt散列数据”c#示例(已存档)

其他回答

作为一个密钥加固的咸散列,使用安全算法,如sha-512。

在你的场景中,你可以看看asp.net会员,这是一个很好的做法,存储用户的密码作为散列字符串在数据库中。您可以通过将散列后的传入密码与存储在数据库中的密码进行比较来验证用户。

所有东西都是为此目的而构建的,请查看asp.net会员

背景 你从来没有……真的……需要知道用户的密码。您只是想验证输入的用户知道某个帐户的密码。

散列: 通过强哈希函数存储哈希(单向加密)的用户密码。 搜索“c#加密密码”会给出大量的例子。

查看在线SHA1哈希创建者,了解哈希函数产生的内容(但不要使用SHA1作为哈希函数,使用更强的函数,如SHA256)。

现在,散列密码意味着您(和数据库窃贼)不应该能够将散列反转回原始密码。

如何使用: 但是,如何使用存储在数据库中的这个混合密码呢?

当用户登录时,他们会给你用户名和密码(在原始文本中) 您只需使用相同的哈希代码来哈希输入的密码以获得存储的版本。

因此,比较两个散列密码(用户名的数据库散列和输入的&散列密码)。您可以通过比较他们的散列来判断“他们输入的内容”是否与“原始用户输入的密码”相匹配。

额外学分:

问:如果我有你的数据库,难道我不能像开膛手约翰一样,开始进行哈希,直到找到与你存储的哈希密码匹配的密码吗? (因为用户选择了简短的字典单词……这应该很容易)

答案:是的……是的,他们可以。

所以,你应该“盐”你的密码。 参见维基百科关于盐的文章

参见“如何使用salt散列数据”c#示例(已存档)

最好的安全实践是根本不存储密码(甚至不加密),而是存储加密密码的咸散列(每个密码具有唯一的盐)。

这样(实际上)就不可能检索明文密码。

我强烈建议你阅读《足够的彩虹表:关于安全密码方案你需要知道什么》和《如何安全存储密码》这两篇文章。

很多程序员,包括我自己,认为他们理解安全和哈希。可悲的是,我们大多数人就是不这样做。