我正在一个必须进行身份验证(用户名和密码)的项目中
它还连接到数据库,所以我想我会将用户名和密码存储在那里。 但是,在数据库上的表中仅具有文本字段的密码似乎不是一个好主意。
我正在使用C#并连接到2008 Express服务器。 谁能(以尽可能多的示例)建议存储这种类型的数据的最佳方法是什么?
附言:如果可以提供充分的理由,我不希望此信息不存储在数据库中
#1楼
如果您不需要反转哈希,我将使用MD5 / SHA1作为密码。 当用户登录时,您可以只加密给定的密码并将其与哈希进行比较。 在这种情况下,几乎不可能发生哈希冲突,除非有人获得对数据库的访问权并看到他们已经有冲突的哈希。
#2楼
在您的方案中,您可以查看asp.net成员身份,这是一个好习惯,将用户的密码作为哈希字符串存储在数据库中。 您可以通过将散列的传入密码与数据库中存储的密码进行比较来对用户进行身份验证。
一切都为此目的而构建,请查看asp.net成员资格
#3楼
您将密码存储在纯文本字段中是一个可怕的主意,这是正确的。 但是, 就位置而言 ,在大多数情况下(您真的会想到(我实在想不出任何反例)),在数据库中存储密码表示是正确的做法。 通过表示,我的意思是您想使用盐(每个用户应该有所不同)和安全的1向算法对密码进行哈希处理并存储该密码,从而丢弃原始密码。 然后,当您要验证密码时,可以对值进行哈希处理(使用相同的哈希算法和盐),并将其与数据库中的哈希值进行比较。
因此,尽管您正在考虑这是一件好事,而且这是一个好问题,但这实际上是这些问题的重复(至少):
为了进一步说明问题,简单地散列密码并存储的危险在于,如果侵入者拥有您的数据库,他们仍然可以使用所谓的Rainbow表来“解密”数据库。密码(至少显示在彩虹表中的密码)。 为了解决这个问题,开发人员在密码中添加了盐 ,如果正确完成,则使得彩虹攻击根本不可行。 请注意,常见的误解是在所有密码中简单地添加相同的唯一且长字符串。 虽然这并不可怕 ,但最好为每个密码添加唯一的盐。 阅读更多。
#4楼
使用诸如sha-512之类的安全算法作为密钥强化的盐化哈希。
#5楼
最佳安全实践是根本不存储密码(甚至不加密),而是存储加密密码的加盐哈希(每个密码具有唯一的盐)。
这样,(实际上)不可能检索明文密码。
来源:oschina
链接:https://my.oschina.net/stackoom/blog/3161378