c# - 密码加密

标签 c# sql encryption

我正在为 C# 中的应用程序创建登录屏幕。在我的登录屏幕中,我正在从数据库中读取用户名和密码,并检查输入的用户名和密码是否正确。当我从数据库中读取密码时,我需要密码进行加密。谁能解释一下加密和解密是如何工作的。

  1. 是否必须将加密值存储在数据库中以供读取。
  2. 现在我有两个字段

    column names: username         password 
    
    values:        admin            password
    
  3. 我应该将密码的加密值存储在登录表的另一个字段中吗?

最佳答案

第一:现在常用的方法是存储密码的加盐哈希值,而不是明文密码本身(首选 SHA-1 和更好的哈希算法,避免使用 MD5,因为它不再安全)。当用户登录时,你重新计算输入字符串的哈希值,然后将它与存储在数据库中的字符串进行比较。

编辑:为什么不应该对密码使用加密?因为当攻击者知道加密的 key 时,你们所有的密码都会暴露(这很糟糕)。如果你使用哈希,他只能一个一个地猜测(这并不容易)。否则,哈希算法通常比加密更快,您将获得性能优势。

编辑:为什么你应该存储加盐哈希,而不是哈希?因为散列算法可以保证,如果对相同的字符串进行散列,结果是相同的。这可能会导致一个问题,当攻击者看到相同的哈希值时,他可以猜测这些文本是相同的,这给了他获得原始密码的机会。

Salt 的意思是除了原始文本之外,你还放了一些随机文本,因此,两个相同的字符串将生成不同 的哈希值

看看这个:http://www.obviex.com/samples/hash.aspx

如果用户忘记了密码,可以使用很多网站都在使用的重设密码功能:

  1. 用户请求重设密码
  2. 包含特殊链接(包括 secret token /PIN)的电子邮件将发送到注册的电子邮件地址,允许用户重置其密码。
  3. 一个随机创建的密码将再次发送给用户,然后他可以登录并更改他的密码。

2012 年 5 月 14 日更新: 答案似乎过时了,而且并不完全正确。人们正在转向更安全的散列加密算法来存储密码。现在一个值得注意的解决方案是 bcrypt,另一个(新的和有前途的)是 scrypt。

这些加密的优点是什么?他们很慢!比散列算法慢得多。借助 GPU 的强大功能(例如,nVidia 的 CUDA),现在破解哈希值并非不可能,而且速度慢会使破解这些加密变得更加困难。

您可以在以下位置找到有关 bcrypt 的更多信息:http://codahale.com/how-to-safely-store-a-password/

其次:您应该将用户表(包含用户配置文件,例如全名、DoB、地址...)和登录表(其中包含用户名和密码,以及一些特殊属性)分开。这将导致更好的管理并降低暴露敏感信息的风险

关于c# - 密码加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6106174/

相关文章:

c# - 使用 WPF 在 C# 中创建带有文本的图像并将其另存为 .png

c# - Entity Framework : multiple queries vs inner joins

mysql - 具有多个连接的 MySQL 查询执行计划效率低下

sql-server-2005 - 如何购买用于 SQL Server 2005 的 SSL 证书

encryption - 哪些可打印的 ASCII 字符通常会出现在英文文本中?

c# - 如何从我的 C# 单元测试中通过 SWIG 调试到 Quantlib

c# - "if"语句中复合 bool 表达式的运算顺序是什么

sql - BCP不返回错误,但也不复制任何行

python,将 pandas 数据帧转储到 SQL 数据库中

ios - 使用 Realm 加密功能是否会对应用商店提交产生影响?