密码加密

bha*_*thi 3 c# sql encryption

我正在为C#中的应用程序创建登录屏幕.在我的登录屏幕中,我正在从数据库中读取用户名和密码,并检查输入的用户名和密码是否正确.我在从数据库中读取密码时需要密码加密.任何人都可以解释加密和解密的工作原理.

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

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

Vim*_*987 14

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

编辑:为什么不使用加密密码?因为当攻击者知道加密密钥时,所有密码都会暴露出来(这非常糟糕).如果你使用哈希,他就可以逐个猜测(这并不容易).否则,哈希算法通常比加密更快,您将获得性能优势.

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

Salt意味着除了原始文本之外,您还会添加一些随机文本,因此,两个相同的字符串将生成不同的哈希值

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

如果用户忘记了密码,您可以使用许多网站正在使用的重置密码功能:

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

更新2012年5月14日:答案似乎很旧,并不完全正确.人们正在转向更安全的哈希加密算法来存储密码.现在值得注意的解决方案之一是bcrypt,另一个(新的和有希望的)是scrypt.

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

你可以在http://codahale.com/how-to-safely-store-a-password/找到更多关于bcrypt的信息.

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