Encryption 如何重新添加“;独特的;用户何时登录?

Encryption 如何重新添加“;独特的;用户何时登录?,encryption,Encryption,我正在学习哈希和加密,但似乎无法理解这一点: 客户端:新用户登录=>创建密码=>以明文形式发送到服务器 服务器:服务器生成一个随机的“salt”=>纯文本和salt是统一的=>散列函数(例如SHA-3)将密码+salt散列成散列=>散列存储在数据库中 客户端:同一用户注销并登录=>以明文形式发送到服务器的密码 服务器:密码需要重新添加创建帐户时生成的相同的salt,以获得相同的哈希值 服务器如何生成相同的随机和唯一的salt? 盐是否存储在不同的数据库中? 如果数据库遭到破坏,黑客也将获得对sa

我正在学习哈希和加密,但似乎无法理解这一点:

客户端:新用户登录=>创建密码=>以明文形式发送到服务器

服务器:服务器生成一个随机的“salt”=>纯文本和salt是统一的=>散列函数(例如SHA-3)将密码+salt散列成散列=>散列存储在数据库中

客户端:同一用户注销并登录=>以明文形式发送到服务器的密码

服务器:密码需要重新添加创建帐户时生成的相同的salt,以获得相同的哈希值

服务器如何生成相同的随机和唯一的salt? 盐是否存储在不同的数据库中?
如果数据库遭到破坏,黑客也将获得对salt的访问权,只需使用salt对rainbow表进行暴力攻击并将其清除。

随机生成的salt必须存储在数据库中,并链接到登录用户。它可以简单地添加为用户表中的另一列

在典型设置中,salt和密码(或其之后的版本) 密钥拉伸)通过密码连接和处理 散列函数和输出散列值(但不是原始值 密码)与salt一起存储在数据库中

资料来源:检索日期:21年2月19日

盐的生成取决于您使用的技术。以下堆栈溢出答案有一个PHP示例:


密码也不应以明文形式发送到服务器。这可以通过HTTPS完成,例如当用户再次登录时。密码与电子邮件一起发送到服务器端

电子邮件用于获取用户记录,然后将针对该电子邮件保存的
哈希值与新哈希值(输入的salt+密码)进行比较

validate函数方法匹配两个不同的散列值,并检查输入的密码是否相同

例如,我在节点JS中使用bcrypt,它有一个方法
compareSync
,该方法将输入的密码与保存的哈希匹配
bcrypt.compareSync(密码、数据库哈希)

salt与散列一起存储,在验证散列时仅从中提取。初学者经常忽略的一个微妙之处是,构建彩虹表比强制使用相同的密码空间要复杂得多。因此,彩虹表只有在额外的工作可以分摊到多次密码攻击时才有用。每个用户一个唯一的salt迫使攻击者为每个用户构建一个不同的彩虹表,从而使彩虹表攻击比直接的暴力更糟糕。@PresidentJamesK.Polk是的,这让我感到困惑。基本上,salt只是补偿了人们在一开始没有生成强密码时的懒惰。但是,然后salt被存储在一个不同的数据库中?如果数据库被破坏,黑客也将获得对salt的访问权,只需使用salt对rainbow表进行暴力破解即可。@WalterMonecke-salt的目的是让具有相同密码的不同用户获得不同的哈希值。不同的用户有不同的盐,所以彩虹表是不可行的。最常见和最简单的方法是将盐存储为用户表中的另一列。我猜盐也可以储存在其他地方以进一步“保护”,但这样做当然有好处/缺点。这种想法是,与同时对每个用户进行暴力攻击相比,对单个用户进行暴力攻击需要更长的时间。如果使用AES256存储密码,那么对单个PC进行暴力攻击所需的时间将比宇宙时代还要长@WalterMonecke-是的,但是由于散列不同,您必须分别为每个帐户执行此操作。对于非盐密码散列和彩虹表,通常需要考虑的是,您只需执行一次,就可以同时获得所有帐户的所有密码。