给项目安装个包 ... 名字是 bcrypt .. 可以使用 npm 或者 yarn 去安装 ..
yarn add bcrypt
然后再回到项目 .. 打开 index.js ... 先导入刚才安装的 bcrypt 这个包 ..
添加一个 password ... 它表示要 hash 的用户的密码 ..
再用一下 bcrypt 的 genSalt .. 可以先在 hash 之前生成点要加的盐 .. 其实就是一串随机的字符 ..
它的第一个参数是 saltRounds ... 这个值越大就越安全一些 ... 默认它的值是 10 .. 然后是一个回调 .. 第一个参数是出现的错误,可以用 error 表示 .. 第二个参数是 genSalt 生成的 salt ..
可以在控制台上输出生成的 salt ..
在这个回调里,我们可以再用一下 bcrypt 的 hash 方法,去 hash 指定的字符 .. 它的第一个参数就是要 hash 的字符 ... 比如可以是用户提交过来的密码 .. 第二个参数是 salt .. 这个 salt 是用 genSalt 生成的 ... 可以使用 salt 来表示 ..
第三个参数是个回调 .. error 表示错误 .. hash 表示 hash 之后的结果 .. 我们可以把它也输出到控制台上看一下 ..
保存 ... 回到命令行... 执行一下 node index.js
上面输出的是生成的 salt,还有 hash 了指定字符外加 salt 之后的这个 hash ... 再执行几次 ... 你会发现,每次执行输出的结果都不一样 .. 因为 hash 的时候用的 salt 每次都会不一样 ..
这个 hash 的结果里面,有一部分表示的是在 hash 的时候使用的 salt ...
compare
假设我们存储在数据库里的用户的密码是这个 hash ... 现在我们可以比较一下,用户登录的时候输入的密码,跟我们在数据库里存储的 hash 之后的密码是否匹配 ..
复制一下这个 hash ... 回到 index.js ... 添加一个 hashPassword ... 它的值假设就是我们存储在数据库里的 hash 之后的用户密码 ..
再添加一个 userInputPassword ... 它的值表示的是用户请求验证身份的时候提供给我们的密码 ...
下面我们可以使用 bcrypt 的 compare 方法去比较一下 ... 先是用户输入的密码 .. userInputPassword .. 然后是一个 hash,这个 hash 应该是我们存储在数据库里的 hash 之后的用户密码 ..
它会返回 Promise ... 可以用一个 then ... result 表示比较的结果 ... 再把这个结果输出到控制台上 ..
回到命令行 .. 执行一下 node index.js ..
比较的结果是 true ... 回来再修改一下 .. 比如用户输入的是 password1 .. 再回来执行一下 ... 这次会显示 false ... 表示用户输入的密码跟我们存储的 hash 之后的密码不匹配 ...