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