在数据库中存储密码的最佳方法
我正在开发一个需要authentication的项目(用户名/密码)
它也连接到一个数据库,所以我想我会在那里存储用户名和密码,但它似乎不是一个好主意,只是一个坐在数据库中的表中的文本字段的密码
我正在使用C#并连接到2008 Express服务器。 任何人都可以build议(尽可能多的例子)什么是最好的方式来存储这种types的数据?
(我打开这个想法,这个信息不存储在数据库中,如果有一个很好的理由可以提供)
将密码存储在纯文本字段中是正确的,这是一个可怕的想法。 然而, 就位置而言 ,对于大多数情况下,你将遇到的(我真的不能想到任何反例)将密码的表示存储在数据库中是正确的事情。 通过表示,我的意思是说,你想散列密码使用盐(这应该是每个用户不同)和一个安全的单向algorithm和存储,扔掉原来的密码。 然后,当你想validation一个密码,你散列值(使用相同的散列algorithm和盐),并将其与数据库中的哈希值进行比较。
所以,虽然这是一件好事,但是您正在考虑这个问题,这是一个很好的问题,但这实际上是这些问题的重复(至less):
- 如何最好地存储用户信息和用户login名和密码
- 存储数据库密码的最佳实践
- 腌制您的密码:最佳实践?
- 以纯文本forms存储密码在PHPvariables或PHP常量是否可以?
为了进一步澄清腌制位,只需简单地对一个密码进行散列和存储,即如果一名侵入者获得了数据库的保留,他们仍然可以使用所谓的彩虹表来“解密”密码(至less在彩虹表中显示的那些)。 为了解决这个问题,开发人员在密码中添加一个盐 ,如果做得好的话,彩虹的攻击是不可行的。 请注意,一个常见的误解是简单地为所有密码添加相同的唯一string和长string; 虽然这并不可怕 ,但最好为每个密码添加独特的盐。 阅读更多。
背景你永远……真的……需要知道用户的密码。 你只是想validation一个传入的用户知道一个帐户的密码。
哈希值:通过强大的哈希函数存储用户密码哈希(单向encryption)。 search“c#encryption密码”给出了一大堆例子。
查看在线SHA1哈希创build器,了解哈希函数产生的内容(但不要使用SHA1作为哈希函数,而要使用更强大的内容,例如SHA256)。
现在,哈希密码意味着你(和数据库窃贼)不应该能够将哈希反转回原始密码。
如何使用它:但是,你说,我该如何使用这个存储在数据库中的密码?
当用户login时,他们会把你的用户名和密码(原始文本)交给你。你只要使用相同的散列码来散列该input的密码即可获得存储的版本。
因此,比较两个哈希密码(用户名的数据库哈希和input的哈希密码)。 您可以通过比较它们的散列来判断“他们input的内容”是否与“原始用户input的密码”匹配。
额外信贷:
问题:如果我有你的数据库,那么我不能只是像开膛手约翰一样的cookies,并开始做散列,直到我find你的存储,哈希密码匹配? (因为用户总是select简短的字典单词…应该很容易)
答:是的,他们可以。
所以,你应该“密码”你的密码。 请参阅维基百科有关盐的文章
请参阅“如何用数据散列数据”C#示例
作为一个密钥强化盐腌散列,使用一个安全的algorithm,如sha-512。
最好的安全做法是根本不存储密码(甚至不encryption),而是存储encryption密码的盐渍散列(每个密码有一个唯一的盐)。
这样(几乎)不可能检索明文密码。
我完全推荐阅读彩虹表中的文章:关于安全密码scheme需要了解的内容 [无效链接, 在互联网存档中复制 ]以及如何安全地存储密码 。
包括我自己在内的许多编码者认为他们理解安全和散列。 可悲的是,我们大多数人都没有。
我可能会略微偏离主题,因为你提到了用户名和密码的需要,我对这个问题的理解并不是最好的,但OpenID是值得考虑的事情吗?
如果您使用OpenID,那么如果我正确理解技术并且用户可以使用他们已有的凭据,则根本不会最终存储任何凭证,从而避免需要创build特定于您的应用程序的新身份。
如果所讨论的应用程序纯粹是为了内部使用,可能并不合适
RPX提供了一个很好的方法来将OpenID支持集成到一个应用程序中。
我会MD5 / SHA1的密码,如果你不需要能够扭转散列。 当用户login时,您可以encryption给定的密码并将其与哈希进行比较。 在这种情况下,散列冲突几乎是不可能的,除非有人能够访问数据库,并且看到他们已经碰撞的散列。
在您的场景中,您可以查看一下asp.net成员资格,将用户的密码存储为数据库中的散列string是个好习惯。 您可以通过比较散列的传入密码和存储在数据库中的密码来validation用户身份。
一切都build立了这个目的,检查出asp.net成员资格