You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级bcryptjs至v3.0.0后遇加密模块不可用错误求助

解决bcryptjs ^3.0.0在Node.js v18.18.0中出现的crypto模块不可用错误

问题重现

升级bcryptjs到^3.0.0后,执行以下哈希代码报错:

const bcrypt = require("bcryptjs");

const password = "mypassword";
const hashedPassword = bcrypt.hashSync(password, 10);

console.log(hashedPassword);

错误信息:

Error: Neither WebCryptoAPI nor a crypto module is available. Use bcrypt.setRandomFallback to set an alternative

已尝试操作:

  • 确认Node.js环境中crypto模块可用
  • 调用bcrypt.setRandomFallback(() => require("crypto").randomBytes(16))设置回退,但问题未解决

解决方案

1. 调整回退函数的返回格式

bcryptjs 3.x要求回退函数返回Uint8Array类型(WebCryptoAPI标准格式),Node.js的crypto.randomBytes()返回的Buffer虽继承自Uint8Array,但部分场景下检测逻辑不识别,修改回退函数:

const crypto = require('crypto');
const bcrypt = require("bcryptjs");

bcrypt.setRandomFallback(() => {
  const buffer = crypto.randomBytes(16);
  // 转换为标准Uint8Array
  return new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength);
});

const password = "mypassword";
const hashedPassword = bcrypt.hashSync(password, 10);

console.log(hashedPassword);

2. 手动指定Node.js crypto实现

如果自动检测逻辑失效,直接覆盖bcrypt的加密实现:

const crypto = require('crypto');
const bcrypt = require("bcryptjs");

// 手动绑定Node.js crypto的随机数生成逻辑
bcrypt.setCrypt({
  getRandomValues: (arr) => {
    const buffer = crypto.randomBytes(arr.length);
    arr.set(buffer);
    return arr;
  }
});

const password = "mypassword";
const hashedPassword = bcrypt.hashSync(password, 10);

console.log(hashedPassword);

3. 排查环境特殊限制

如果是打包环境(Webpack/Vite)或Electron,可能存在crypto模块被屏蔽的情况:

  • Webpack需在配置中启用node.crypto:
    module.exports = {
      node: {
        crypto: true
      }
    };
    
  • Electron渲染进程需开启nodeIntegration或通过预加载脚本暴露crypto模块。

4. 临时降级(应急方案)

若上述方法均无效,可临时降级到兼容性更好的2.x版本:

npm install bcryptjs@^2.4.3

内容的提问来源于stack exchange,提问作者Nijat Aliyev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 09:40:03