使用 bcrypt 和对象分配的密码散列
Password hashing with bcrypt and object assigning
我需要将明文密码换成散列密码。我正在使用 bcryptjs 来帮助我。
我已尝试分配明文散列密码中的密码,但我在 bash 上遇到错误。
我正在尝试运行的代码:
const bcrypt = require('bcryptjs');
const students = require('./students1.json');
const fs = require('fs');
let secureUsers = [];
for (let student of students) {
let salt = bcrypt.genSaltSync(10);
let passHash = bcrypt.hashSync(student.password, salt);
Object.assign(student.password, passHash);
secureUsers.push(secStudent);
}
fs.writeFileSync('secStudents.json', JSON.stringify(secureUsers, null, 2));
console.log('wrote file!');
我遇到的错误:
$ node bcryptExample.js
C:\Users\mziad\assignment-mziadeh1\servers\bcryptExample.js:13
Object.assign(student.password, passHash);
^
TypeError: Cannot assign to read only property '0' of object '[object String]'
at Function.assign (<anonymous>)
at Object.<anonymous> (C:\Users\mziad\assignment-mziadeh1\servers\bcryptExample.js:13:12)
at Module._compile (internal/modules/cjs/loader.js:701:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:712:10)
at Module.load (internal/modules/cjs/loader.js:600:32)
at tryModuleLoad (internal/modules/cjs/loader.js:539:12)
at Function.Module._load (internal/modules/cjs/loader.js:531:3)
at Function.Module.runMain (internal/modules/cjs/loader.js:754:12)
at startup (internal/bootstrap/node.js:283:19)
at bootstrapNodeJSCore (internal/bootstrap/node.js:622:3)
我要散列的示例:
{
"netid": "ky4531",
"firstName": "Frankie",
"lastName": "Griffith",
"email": "erasement1803@outlook.com",
"password": "t'|x/)$g"
},
{
"netid": "tw0199",
"firstName": "Julietta",
"lastName": "Vargas",
"email": "ezekiel1960@outlook.com",
"password": "Rc*pKe$w"
}
我需要将密码与哈希码交换,因此我尝试分配它。但是我收到一个我不明白的错误,我现在无法真正发现我的代码有任何问题。
您似乎误解了 Object.assign 函数的工作原理。
Object.assign 函数的作用是,它遍历每个 属性 个源参数(第一个参数后面的参数)并在第一个参数中覆盖它。
您的示例中的问题是您尝试使用字符串作为参数 Object.assign('abc', 'def')
来调用 Object.assign。 JavaScript 中的字符串文字实际上是一个字符数组,并且是一个以索引为属性的对象中的数组。默认情况下,无法重新分配字符串属性(索引)(可写:false)。
这是一个演示:
var a = 'abc';
console.log(a[0]) // outputs 'a'
var descriptor = Object.getOwnPropertyDescriptor(a, 0)
console.log(descriptor)
//outputs
/*
{ value: 'a',
writable: false,
enumerable: true,
configurable: false }
*/
Object.assign('abc', 'def');// throws Cannot assign to read only property '0' of object '[object String]'
如您所见,writable 设置为 false,这意味着您无法重新分配字符串中的每个字符。这解释了为什么错误消息说 属性 '0' of string 'abc' cannot be assigned with new value.
所以解决方案是 student.password = passHash
而不是 Object.assign(student.password, passHash);
我需要将明文密码换成散列密码。我正在使用 bcryptjs 来帮助我。
我已尝试分配明文散列密码中的密码,但我在 bash 上遇到错误。
我正在尝试运行的代码:
const bcrypt = require('bcryptjs');
const students = require('./students1.json');
const fs = require('fs');
let secureUsers = [];
for (let student of students) {
let salt = bcrypt.genSaltSync(10);
let passHash = bcrypt.hashSync(student.password, salt);
Object.assign(student.password, passHash);
secureUsers.push(secStudent);
}
fs.writeFileSync('secStudents.json', JSON.stringify(secureUsers, null, 2));
console.log('wrote file!');
我遇到的错误:
$ node bcryptExample.js
C:\Users\mziad\assignment-mziadeh1\servers\bcryptExample.js:13
Object.assign(student.password, passHash);
^
TypeError: Cannot assign to read only property '0' of object '[object String]'
at Function.assign (<anonymous>)
at Object.<anonymous> (C:\Users\mziad\assignment-mziadeh1\servers\bcryptExample.js:13:12)
at Module._compile (internal/modules/cjs/loader.js:701:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:712:10)
at Module.load (internal/modules/cjs/loader.js:600:32)
at tryModuleLoad (internal/modules/cjs/loader.js:539:12)
at Function.Module._load (internal/modules/cjs/loader.js:531:3)
at Function.Module.runMain (internal/modules/cjs/loader.js:754:12)
at startup (internal/bootstrap/node.js:283:19)
at bootstrapNodeJSCore (internal/bootstrap/node.js:622:3)
我要散列的示例:
{
"netid": "ky4531",
"firstName": "Frankie",
"lastName": "Griffith",
"email": "erasement1803@outlook.com",
"password": "t'|x/)$g"
},
{
"netid": "tw0199",
"firstName": "Julietta",
"lastName": "Vargas",
"email": "ezekiel1960@outlook.com",
"password": "Rc*pKe$w"
}
我需要将密码与哈希码交换,因此我尝试分配它。但是我收到一个我不明白的错误,我现在无法真正发现我的代码有任何问题。
您似乎误解了 Object.assign 函数的工作原理。 Object.assign 函数的作用是,它遍历每个 属性 个源参数(第一个参数后面的参数)并在第一个参数中覆盖它。
您的示例中的问题是您尝试使用字符串作为参数 Object.assign('abc', 'def')
来调用 Object.assign。 JavaScript 中的字符串文字实际上是一个字符数组,并且是一个以索引为属性的对象中的数组。默认情况下,无法重新分配字符串属性(索引)(可写:false)。
这是一个演示:
var a = 'abc';
console.log(a[0]) // outputs 'a'
var descriptor = Object.getOwnPropertyDescriptor(a, 0)
console.log(descriptor)
//outputs
/*
{ value: 'a',
writable: false,
enumerable: true,
configurable: false }
*/
Object.assign('abc', 'def');// throws Cannot assign to read only property '0' of object '[object String]'
如您所见,writable 设置为 false,这意味着您无法重新分配字符串中的每个字符。这解释了为什么错误消息说 属性 '0' of string 'abc' cannot be assigned with new value.
所以解决方案是 student.password = passHash
而不是 Object.assign(student.password, passHash);