[TOC] <br/><br/><br/> # <b style="color:#4F4F4F;">简介说明</b> 原文链接: - [crypto](https://github.com/nodejs/node/blob/main/doc/api/crypto.md) ``` 版本:crypto 作用:提供了加密功能,包括对 OpenSSL 的哈希、HMAC、加密、解密、签名、以及验证功能的一整套封装 ``` <br/> # <b style="color:#4F4F4F;">crypto</b> <br/> # <span style="color:#619BE4">*createHash()</span> ***** 创建一个Hash 算法实例 <br/> ### 示例内容 <span style="color:red;">1. 举例说明</span> ``` const filename = process.argv[2]; const crypto = require('crypto'); const fs = require('fs'); const hash = crypto.createHash('sha256'); const input = fs.createReadStream(filename); input.on('readable', () => { // 哈希流只会生成一个元素。 const data = input.read(); if (data) hash.update(data); else { console.log(`${hash.digest('hex')} ${filename}`); } }); ``` <br/> # <span style="color:#619BE4">*createHmac()</span> ***** 创建一个Hmac算法实例 <br/> ### 示例内容 <span style="color:red;">1. 举例说明</span> ``` const filename = process.argv[2]; const crypto = require('crypto'); const fs = require('fs'); const hmac = crypto.createHmac('sha256', '密钥'); const input = fs.createReadStream(filename); input.on('readable', () => { // 哈希流只会生成一个元素。 const data = input.read(); if (data) hmac.update(data); else { console.log(`${hmac.digest('hex')} ${filename}`); } }); ``` <br/> # <span style="color:#619BE4">*createDiffieHellman()</span> ***** 创建一个DH算法实例 <br/> ### 示例内容 <span style="color:red;">1. 举例说明</span> ``` const crypto = require('crypto'); // xiaoming's keys: var ming = crypto.createDiffieHellman(512); var ming_keys = ming.generateKeys(); var prime = ming.getPrime(); var generator = ming.getGenerator(); // xiaohong's keys: var hong = crypto.createDiffieHellman(prime, generator); var hong_keys = hong.generateKeys(); // xiaohong算出 var hong_secret = hong.computeSecret(ming_keys); // xiaoming算出 var ming_secret = ming.computeSecret(hong_keys); // print secret: console.log('Secret of Xiao Ming: ' + ming_secret.toString('hex')); console.log('Secret of Xiao Hong: ' + hong_secret.toString('hex')); ``` <br/> # <span style="color:#619BE4">*createDecipheriv()</span> ***** 创建一个对称解密算法实例 <br/> # <span style="color:#619BE4">*createCipheriv()</span> ***** 创建一个对称加密算法实例 <br/> ### 示例内容 <span style="color:red;">1. 举例说明</span> ``` const crypto = require('crypto'); // 加密 function genSign(src, key, iv) { let sign = ''; const cipher = crypto.createCipheriv('aes-128-cbc', key, iv); sign += cipher.update(src, 'utf8', 'hex'); sign += cipher.final('hex'); return sign; } // 解密 function deSign(sign, key, iv) { let src = ''; const cipher = crypto.createDecipheriv('aes-128-cbc', key, iv); src += cipher.update(sign, 'hex', 'utf8'); src += cipher.final('utf8'); return src; } // ase-128-cbc 加密算法要求key和iv长度都为16 const key = Buffer.from('9vApxLk5G3PAsJrM', 'utf8'); const iv = Buffer.from('FnJL7EDzjqWjcaY9', 'utf8'); // 加密 const sign = genSign('hello world', key, iv); console.log(sign); // 764a669609b0c9b041faeec0d572fd7a // 解密 const src = deSign('764a669609b0c9b041faeec0d572fd7a', key, iv); console.log(src); // hello world module.exports = {genSign, deSign}; ``` <br/> # <span style="color:#619BE4">*privateEncrypt()</span> ***** 非对称加密私钥算法实例 <br/> ### 示例内容 <span style="color:red;">1. 举例说明</span> ``` const fs = require('fs'), crypto = require('crypto'); // 从文件加载key: function loadKey(file) { // key实际上就是PEM编码的字符串: return fs.readFileSync(file, 'utf8'); } let prvKey = loadKey('./rsa-prv.pem'), pubKey = loadKey('./rsa-pub.pem'), message = 'Hello, world!'; // 使用私钥加密: let enc_by_prv = crypto.privateEncrypt(prvKey, Buffer.from(message, 'utf8')); console.log('encrypted by private key: ' + enc_by_prv.toString('hex')); let dec_by_pub = crypto.publicDecrypt(pubKey, enc_by_prv); console.log('decrypted by public key: ' + dec_by_pub.toString('utf8')); ``` <br/> # <span style="color:#619BE4">*scrypt()</span> ***** 提供异步的 scrypt 实现。 Scrypt 是一个基于密码的密钥派生函数,被设计为在计算和内存方面都非常高成本,目的是使暴力破解无法成功。 <br/> # <span style="color:#619BE4">*scryptSync()</span> ***** 提供同步的 scrypt 实现。 Scrypt 是一个基于密码的密钥派生函数,被设计为在计算和内存方面都非常高成本,目的是使暴力破解无法成功。 <br/> # <span style="color:#619BE4">*sign()</span> ***** 为数据签名,防止伪造 <br/> # <span style="color:#619BE4">*verify()</span> ***** 验证数据签名 <br/>