转载: crypto:start() 错误。

本文详细介绍了在ERLANG中遇到加密库加载失败的错误时如何通过下载、配置和编译OPENSSL来解决问题的过程。包括了从下载源码、指定安装路径、编译与安装等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

错误信息: 
Eshell V5.10.3  (abort with ^G)
1> crypto:start().
** exception error: undefined function crypto:start/0
2>
=ERROR REPORT==== 12-Mar-2014::17:09:15 ===
Unable to load crypto library. Failed with error:
"load_failed, Failed to load NIF library: '/usr/local/lib/erlang/lib/crypto-3.1/priv/lib/crypto.so: undefined symbol: EC_GROUP_new_curve_GF2m'"
OpenSSL might not be installed on this system.


=ERROR REPORT==== 12-Mar-2014::17:09:15 ===
The on_load function for module crypto returned {error,
                                                 {load_failed,
                                                  "Failed to load NIF library: '/usr/local/lib/erlang/lib/crypto-3.1/priv/lib/crypto.so: undefined symbol: EC_GROUP_new_curve_GF2m'"}}
解决办法:
1、下载openssl源码
    wget http://www.openssl.org/source/openssl-1.0.1f.tar.gz 
    tar zxvf openssl-1.0.1f.tar.gz 
2、进入源码目录,如果不是新下载解压的目录,而且以前有编译安装过的,进入目录后执行make clean以确保能重新编译
    cd openssl-1.0.1f 
3、为了不要和已安装的openssl混淆,这里指定一个新的安装目录
    ./config --prefix=/opt/ssl  
4、config之后,会生成Makefile,打开Makefile找到gcc,在CFLAG参数列表里加上-fPIC
    vim Makefile
CC= gcc  
CFLAG= -fPIC -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -Wa,--noexecstack -m64 -DL_ENDIAN -DTERMIO -O3 -Wall -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM
5、编译并安装
    make && make install 
6、现在进入你的erlang源码安装目录,如果已经编译安装过erlang,为确保能重新编译,先执行:
    make clean 
7、加上openssl安装路径重新configure,如果有安装多个版本的erlang,为了可以方便找到新安装的erl,这里可以指定一个新的安装目录,示例如下:
    ./configure --with-ssl=/opt/ssl/ --prefix=/opt/erlang 
8、编译并安装
    make && make install 
9、运行刚才安装的erlang
    /opt/erlang/bin/erl 
Eshell V5.10.3  (abort with ^G)
1> crypto:start().
ok
2>
<think>好的,我现在需要帮助用户解决“node.js crypto.createHash is not a function”的错误。首先,我得回忆一下Node.js中crypto模块的相关知识。记得crypto模块是Node.js的核心模块之一,用于处理加密功能,比如创建哈希、加密算法等。用户提到的crypto.createHash应该是用来生成哈希对象的函数。 接下来,我需要分析可能的原因。常见的问题可能有几个方面: 1. **Node.js版本问题**:如果用户使用的是非常旧的Node.js版本,可能crypto模块中的某些方法还未支持,或者写法有变化。比如,检查createHash是否存在,可能在某些旧版本中不存在,或者需要不同的引入方式。 2. **拼写错误或语法错误**:用户可能在代码中将crypto写错了,比如大小写不正确,或者createHash的拼写错误。例如,写成createHashh或者createHASH之类的。 3. **模块未引入**:虽然crypto是核心模块,不需要npm安装,但必须通过require引入才能使用。如果用户忘记写const crypto = require('crypto');,那么调用crypto.createHash自然会报错。 4. **运行环境问题**:如果用户不小心在浏览器端尝试运行Node.js的代码,浏览器环境中没有crypto模块,当然会报错。这时候可能需要使用浏览器的加密API,或者使用polyfill。 现在,根据这些可能性,我需要一步步引导用户检查他们的代码和环境。首先,确认他们是否正确引入了crypto模块。然后检查Node.js的版本是否过旧,比如低于某个版本导致API不同。接着查看是否有拼写错误,或者是否在浏览器环境中错误地运行了Node.js代码。 另外,用户提到参考了引用[4],里面提到了crypto-hash在HTTPS环境下的使用,这可能和浏览器相关,但用户的问题是关于Node.js的,所以需要区分清楚环境。可能用户混淆了前端和后端的加密方法,或者在服务端代码中错误地使用了浏览器特定的库。 然后,解决方案可能包括:更新Node.js到最新稳定版本,确保正确引入crypto模块,检查拼写,以及确认代码运行在Node.js环境中而非浏览器。如果用户确实在浏览器环境中需要使用加密功能,可能需要改用Web Crypto API或者其他浏览器兼容的库。 最后,需要验证这些解决方案,比如提供一个正确使用crypto.createHash的示例代码,并建议用户运行node -v检查版本,以及确认代码中没有语法错误。同时,提醒用户注意浏览器和Node.js环境的区别,避免混淆。</think>### Node.js `crypto.createHash is not a function` 错误解决方案 #### 1. 确认Node.js版本是否支持 `crypto.createHash` 是Node.js的核心模块API,但需确保Node.js版本≥0.9.3[^2]。如果版本过旧,升级到最新稳定版本: ```bash nvm install 18 nvm use 18 ``` #### 2. 检查模块引入方式 必须通过`require`正确引入`crypto`模块: ```javascript const crypto = require('crypto'); // 核心模块无需安装 const hash = crypto.createHash('sha256'); // 正确调用 ``` #### 3. 排除浏览器环境干扰 此API仅在Node.js服务端可用。若在浏览器中误用,需改用Web Crypto API: ```javascript // 浏览器端示例 const encoder = new TextEncoder(); const data = encoder.encode('hello'); const hash = await crypto.subtle.digest('SHA-256', data); ``` #### 4. 检查代码拼写错误 常见错误包括: - 大小写错误:`Crypto` vs `crypto` - 方法名错误:`createHash` vs `createHmac` - 参数格式错误:算法名称需小写(如`'sha256'`) #### 5. 验证最小复现示例 创建测试文件`hash-test.js`: ```javascript const crypto = require('crypto'); try { const hash = crypto.createHash('sha256'); console.log('Hash实例创建成功:', hash); } catch (e) { console.error('错误捕获:', e.message); } ``` 运行验证: ```bash node hash-test.js ``` #### 6. 模块系统完整性检查 若使用Webpack等打包工具,需在配置中标记`crypto`为外部依赖: ```javascript // webpack.config.js module.exports = { externals: { crypto: 'crypto' } }; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值