使用LINQ to SQL哈希密码数据库
本文关键字:密码 数据库 哈希 SQL LINQ to 使用 | 更新日期: 2023-09-27 18:25:38
我目前正在处理一个登录表单,我听说存储密码的最好方法是对它们进行哈希,但我是否将"哈希"密码放入数据库(在只放置字节数据类型的列中)?我将字节放入数据库,然后检索,然后将它们转换为字符串,以与用户输入进行比较。这就是工作原理吗?如果是,我将如何在LINQ TO SQL中做到这一点?
我认为一般的方法是在用户创建帐户时,在将密码存储在数据库中之前对其进行salt/hash处理。然后,为了验证用户,对用户的输入进行salt/hash处理,并将其与数据库存储的密码进行比较。
当用户试图对您进行身份验证时,他们会在输入的密码上使用相同的哈希算法,并在数据库中搜索具有输入的用户名和与您刚才生成的用户名匹配的哈希的用户。如果你得到一个结果,那就是用户将他们认证为.
请注意,在任何时候都不会获取哈希并将其转换回明文密码。散列的全部目的是,它是你不能做的事情(至少在任何实际意义上都不是)。它不是加密的,不是双向的。一旦它被散列,如果你能把它变成原始密码,那么你就没有使用足够好的散列算法。
哈希和加密之间有两个主要区别:
1) 例如,当您对密码进行散列时,结果是唯一的,但当您加密时,每次加密相同的数据时,结果应该是随机的。
2) 哈希是单向的,加密是双向的,这意味着检索哈希数据没有意义,但可以解密加密数据。
这里可能会出现一个问题:什么时候应该使用哈希和加密???
答案很简单。如果你不想向用户显示真实数据,或者你不想在程序中的任何地方使用它,并且它只用于身份验证或验证(如登录密码),那么明智的做法是使用哈希并将哈希形式的数据保存在数据库中。在进行身份验证时,只需对输入进行散列处理,由于散列处理会得到相同的结果,因此可以搜索所需的表以找到匹配的表。另一方面,加密用于我们可能需要向用户显示或在计算中使用其值的数据(打印付款时显示信用卡号,以显示哪张信用卡支付的付款)