NodeJS 内置模块之crypto

文章背景node 7.2.0版本。主要参照内容Nodejs官方文档。语法ES6。

crypto作为nodeJS已经稳定下来的模块在整个node中具有举足轻重的地位,一切app都需要加密解密,那么crypto就是一个提供加密功能的模块。在这个模块中已经打包了OpenSSL hash, HMAC(哈希信息验证码),cipher(加密),decipher(解密),sign(签名)以及verify(验证)的功能。

我们先看nodeJS官方文档中的一段代码,我们逐句进行分析。

const crypto = require('crypto');
//首先引入crypto模块进项目中;
const secret = 'abcdefg';
//随手写一段明文字符串,保存到常量secret中。
const hash = crypto.createHmac('sha256', secret)//我们首先调用crypto模块中的createHmac()方法,通过sha256算法对明文进行哈希化。
                   .update('I love cupcakes')
//在这段哈希值的基础之上,我们添加明文I love cupcakes。
                   .digest('hex');
//在更新之后,我们将更新的内容的进行十六进制的消化吸收。
console.log(hash);
// Prints:
//   c0fa1bc00531bd78ef38c628449c5102aeabd49b5dc3a2a516ea6ea959d6658e
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

如果你的node项目中不包含crypto模块,你希望对此进行检查下面这段try catch代码就可以做到,尽管本人认为这种情况微乎其微;

var crypto;
try {
  crypto = require('crypto');
} catch (err) {
  console.log('crypto support is disabled!');
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

证书

所谓SPKAC就是网景内核原生中的一个证明签字请求机制。如今已经正式成为HTML5的注册机元素(HTML5’s keygen element.)中的一部分。

crypto模块使用SPKAC数据提供证书类。大多数场景下用于处理由HTML5 元素生成的输入,NodeJS在其内部安装使用OpenSSL`s SPKAC。

新建证书

我们通过使用new关键字或者调用crypto.Certificate()方法实例化一个证书类型。

const crypto = require('crypto');

const cert1 = new crypto.Certificate();
const cert2 = crypto.Certificate();
  • 1
  • 2
  • 3
  • 4
  • 5

certificate.exportChallenge(spkac);

spkac 数据结构包含了一个公钥和一个质询。certificate.exportChallenge()方法在nodeJS的Buffer表单中返回质询元素。spkac的参数要么是一个字符串要么就是一个Buffer.

const cert = require('crypto').Certificate();
const spkac = getSpkacSomehow();
const challenge = cert.exportChallenge(spkac);
console.log(challenge.toString('utf8'));
  • 1
  • 2
  • 3
  • 4

certificate.exportPublicKey(spkac)

正如上节所述,spkac数据结构是包含一个公钥的,那么返回公钥的方法就是 
certificate.exportPublicKey(spkac);

const cert = require('crypto').Certificate();
const spkac = getSpkacSomehow();
const publicKey = cert.exportPublicKey(spkac);
console.log(publicKey);
// Prints: the public key as <Buffer ...>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

certificate.verifySpkac(spkac)

如果返回的被赋予的spkac数据结构是有效的,那么返回值则为true,反之false.

const cert = require('crypto').Certificate();
const spkac = getSpkacSomehow();
console.log(cert.verifySpkac(Buffer.from(spkac)));
// Prints: true or false
  • 1
  • 2
  • 3
  • 4
  • 5

Cipher加密

cipher类实例化后会被译成数据,该类往往用于以下两种情况: 
1.作为一个流式文件它可读可写。一个简单的未编译的数据会被写入到可读端,并生成 
编译数据。 
2.使用cipher.update()和cipher.final()两种方法直接生成编译数据。

crypto.createCiper()或者cryto.createCipheriv()方法用于创建Cipher实例化对象。一定要注意,使用new关键字是没办法直接创建一个Cipher对象的。

我们来看下面这段代码:

const crypto = require('crypto');
const cipher = crypto.createCipher('aes192', 'a password');
//使用aes192对称加密算法,将‘a password’这段明文进行加密
var encrypted = '';
cipher.on('readable', () => {
  var data = cipher.read();
  if (data)
    encrypted += data.toString('hex');
});
cipher.on('end', () => {
  console.log(encrypted);
  // Prints: ca981be48e90867604588e75d04feabb63cc007a8f8ad89b10616ed84d815504
});

cipher.write('some clear text data');
cipher.end();

转载:http://blog.csdn.net/qq_33315185/article/details/53436364
Node.js 中的 crypto 是一个内置模块,用于提供加密和解密功能。它支持各种加密算法和操作,包括哈希函数、对称加密和非对称加密。你可以使用 crypto 模块来实现数据的加密、解密、签名和验证等操作。 要使用 crypto 模块,你需要在你的代码中引入它,例如: ```javascript const crypto = require('crypto'); ``` 一些常见的 crypto 操作包括: 1. 哈希函数:crypto 模块提供了多个哈希函数,如 MD5、SHA-1、SHA-256 等。你可以使用这些函数对数据进行哈希处理,生成唯一的摘要。例如: ```javascript const hash = crypto.createHash('sha256'); hash.update('Hello, world!'); const digest = hash.digest('hex'); console.log(digest); // 输出生成的摘要 ``` 2. 对称加密:crypto 模块支持对称加密算法,如 AES、DES、3DES 等。你可以使用这些算法对数据进行加密和解密。例如: ```javascript const cipher = crypto.createCipher('aes192', 'password'); let encrypted = cipher.update('Hello, world!', 'utf8', 'hex'); encrypted += cipher.final('hex'); console.log(encrypted); // 输出加密后的数据 const decipher = crypto.createDecipher('aes192', 'password'); let decrypted = decipher.update(encrypted, 'hex', 'utf8'); decrypted += decipher.final('utf8'); console.log(decrypted); // 输出解密后的数据 ``` 3. 非对称加密:crypto 模块还支持非对称加密算法,如 RSA。你可以使用这些算法生成公钥和私钥,进行加密和解密。例如: ```javascript const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', { modulusLength: 4096, publicKeyEncoding: { type: 'spki', format: 'pem' }, privateKeyEncoding: { type: 'pkcs8', format: 'pem' } }); console.log(publicKey); // 输出生成的公钥 console.log(privateKey); // 输出生成的私钥 const encrypted = crypto.publicEncrypt(publicKey, Buffer.from('Hello, world!')); console.log(encrypted.toString('base64')); // 输出加密后的数据 const decrypted = crypto.privateDecrypt(privateKey, encrypted); console.log(decrypted.toString('utf8')); // 输出解密后的数据 ``` 这只是 crypto 模块的一小部分功能,你可以查阅 Node.js 文档以获取更详细的信息和使用方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值