Skip to content

Latest commit

 

History

History
204 lines (147 loc) · 4.22 KB

数据加密.md

File metadata and controls

204 lines (147 loc) · 4.22 KB

image

前言

crypto模块提供了加密功能,包括对 OpenSSL 的哈希、HMAC、加密、解密、签名、以及验证功能的一整套封装。

const crypto = require('crypto');

const secret = 'abcdefg';
const hash = crypto.createHmac('sha256',secret).update('I Love cupcakes').digest('hex');

console.log(hash);

关于作者

一个工作八年的草根程序员。

内容

一、Hashing

相关的几个方法

  • createHash:用于创建Hash实例。不能使用new关键字直接地创建Hash对象。可以接受以下几种加密方式
    • md5
    • sha1
    • sha256
    • sha512
    • ripemd160
  • digest:计算摘要,只能调用一次。
  • update:用给定的data更新哈希内容,其编码在inputEncoding中给出。可以调用多次。
var crypto = require("crypto");
var fs = require('fs');
var path = require("path");

var content = fs.readFileSync('nodejs/Exercise/file.txt', {
    encoding: 'utf8'
});
var hash = crypto.createHash("sha256");
var output;

hash.update(content);

output = hash.digest("hex");

console.log(output);

二、HMAC

HMAC 的全称是 Hash-based Message Authentication Code,也即在 hash 的加盐运算。

const crypto = require('crypto');
const fs = require('fs');
const hmac = crypto.createHmac('sha256', '密钥');

const input = fs.readFileSync('nodejs/Exercise/file.txt', {
    encoding: 'utf8'
});
hmac.update(input);
console.log(hmac.digest('hex'));

三、公钥加密

公钥加密功能分布在如下 4 个类中:

3.1 Cipher

Cipher类的实例用于加密数据

crypto.createCipher(algorithm, password)接受两个参数,两参数分别是加密算法、密码

  • algorithm:加密算法
  • password:用来生成密钥、初始化向量。
// 公钥加密

var crypto = require("crypto");
var secret = 'secret';

var cipher = crypto.createCipher('aes192', secret);
var content = 'hello';
var cryptedContent;

cipher.update(content);
cryptedContent = cipher.final('hex');
console.log(cryptedContent);

3.2 Decipher

Decipher 类的实例用于解密数据。

// 公钥解密

var crypto = require("crypto");
var secret = 'secret';

var cipher = crypto.createCipher('aes192', secret);
var content = 'hello';
var cryptedContent;

cipher.update(content);
cryptedContent = cipher.final('hex');
console.log(cryptedContent);

var decipher = crypto.createDecipher("aes192", secret);
var decryptedContent;
decipher.update(cryptedContent, 'hex');
decryptedContent = decipher.final('utf8');
console.log(decryptedContent);

3.3 Sign

Sign类是一个实用工具,用于生成签名。

const crypto = require('crypto');

const {
    privateKey,
    publicKey
} = crypto.generateKeyPairSync('ec', {
    namedCurve: 'sect239k1'
});
const algorithm = 'RSA-SHA256'; // 加密算法VS 摘要算法

function sign(text) {
    var sign = crypto.createSign(algorithm);
    sign.update(text);
    return sign.sign(privateKey, 'hex');
}

// 对内容进行签名
var content = 'hello world';
var signature = sign(content);
console.log(signature);

3.4 Verify

Verify 类是一个实用工具,用于验证签名。

const crypto = require('crypto');

const {
    privateKey,
    publicKey
} = crypto.generateKeyPairSync('ec', {
    namedCurve: 'sect239k1'
});
const algorithm = 'RSA-SHA256'; // 加密算法VS 摘要算法

function sign(text) {
    var sign = crypto.createSign(algorithm);
    sign.update(text);
    return sign.sign(privateKey, 'hex');
}

// 对内容进行签名
var content = 'hello world';
var signature = sign(content);
console.log(signature);

// 校验签名,如果通过,返回true
var verified = verify(content, signature);
console.log(verified);

参考资料

联系作者

平凡世界,贵在坚持。