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

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

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

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


当前回答

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

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

其他回答

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

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

我可能有点跑题了,因为你提到了用户名和密码的需要,我对这个问题的理解也不是最好的,但是OpenID值得考虑吗?

如果您使用OpenID,那么您最终根本不存储任何凭据,如果我正确理解该技术,用户可以使用他们已经拥有的凭据,从而避免了创建特定于应用程序的新身份的需要。

但是,如果所讨论的应用程序纯粹用于内部使用,则可能不适合

RPX提供了一种将OpenID支持集成到应用程序中的好方法。

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

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

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

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

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

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

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

额外学分:

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

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

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

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

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

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

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