gpt4 book ai didi

javascript - Nodejs crypto.getHashes() 返回一个空数组

转载 作者:行者123 更新时间:2023-12-01 16:26:37 26 4
gpt4 key购买 nike

我正在使用 exceljs' sheet protection当我遇到错误时的特性——Error: Hash algorithm 'sha512' not supported!。查看它的源文件后,我发现了错误的原因:crypto.getHashes() 返回一个空数组。我似乎找不到解决方案,也找不到空数组的原因,有什么想法吗?

Node v11.2.0

ExcelJS v3.6.0

src/routes/export-excel/customer.ts

import ExcelJS from "exceljs";

const workbook = new ExcelJS.Workbook();

// workbook config

workbook.eachSheet(async (worksheet, sheetId) => {
worksheet.eachRow((row, rowNumber) => {
row.eachCell((cell, colNumber) => {
switch (exportCols.getCodes()[colNumber - 1]) {
// other case statements
case "date_created":
case "date_modified":
cell.protection = { locked: false }; // locks the cells under the date created & modified columns
break;
}
})
await worksheet.protect("passWord123", {
selectLockedCells: false,
formatCells: true,
insertRows: true,
// other config props
});
})
})

exceljs lib - 保护方法的定义

node_modules/exceljs/lib/utils/worksheet.js Worksheet.protect

// Worksheet Protection
protect(password, options) {
// TODO: make this function truly async
// perhaps marshal to worker thread or something
return new Promise(resolve => {
this.sheetProtection = {
sheet: true,
};
if (password) {
this.sheetProtection.algorithmName = 'SHA-512';
this.sheetProtection.saltValue = Encryptor.randomBytes(16).toString('base64');
this.sheetProtection.spinCount = 100000;
this.sheetProtection.hashValue = Encryptor.convertPasswordToHash(password, 'SHA512', this.sheetProtection.saltValue, this.sheetProtection.spinCount);
}
if (options) {
this.sheetProtection = Object.assign(this.sheetProtection, options);
}
resolve();
});
}

exceljs lib - convertPasswordToHash 方法的定义

node_modules/exceljs/lib/utils/encryptor.js Encryptor.convertPasswordToHash

convertPasswordToHash(password, hashAlgorithm, saltValue, spinCount) {
hashAlgorithm = hashAlgorithm.toLowerCase();
const hashes = crypto.getHashes();
console.log("supported hashes", hashes) // <== hashes was empty w/c caused the 'Hash algorithm '${hashAlgorithm}' not supported!' error to be thrown
if (hashes.indexOf(hashAlgorithm) < 0) {
throw new Error(`Hash algorithm '${hashAlgorithm}' not supported!`);
}

// Password must be in unicode buffer
const passwordBuffer = Buffer.from(password, 'utf16le');
// Generate the initial hash
let key = this.hash(
hashAlgorithm,
Buffer.from(saltValue, 'base64'),
passwordBuffer
);
// Now regenerate until spin count
for (let i = 0; i < spinCount; i++) {
const iterator = Buffer.alloc(4);
// this is the 'special' element of Excel password hashing
// that stops us from using crypto.pbkdf2()
iterator.writeUInt32LE(i, 0);
key = this.hash(hashAlgorithm, key, iterator);
}
return key.toString('base64');
}

如果有人需要更多说明,请不要犹豫,在下方发表评论。

如有任何帮助,我们将不胜感激。

最佳答案

有一个bug on an unrelated project这表明如果数组原型(prototype)已被修改,crypto.getHashes 可以返回一个空数组。在错误报告中,这是由于使用了collections.js。 .

修改数组原型(prototype),无论是通过您自己的代码还是通过在 crypto 模块之前导入的第三方模块,都可能导致 crypto.getHashes 返回一个空数组.

关于javascript - Nodejs crypto.getHashes() 返回一个空数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59925637/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com