数据的加密与解密

听起来好高深,其实这里并不会介绍原理,主要介绍node.js平台提供的加密与解密的工具如何用。

加密和解密的手段有一些,下面一一道来。

Cipher对象用来加密,Decipher对象用来解密。也就是说创建Cipher对象然后调用它的一些“神秘”方法把数据加密,反过来通过创建一个Decipher对象,然后调用它的“秘密”方法把加密的数据解密,还原到原始数据。

那么下面的讲解,会分几个部分,首先介绍创建Cipher对象的方式,2 介绍如何通过Cipher进行加密,3 介绍Decipher对象的创建方式,4 介绍如何通过Decipher对象进行解密。

创建Cipher对象

通过 crypto.createCipher(algorithm, key) 或 crypto.createCipheriv(algorithm, key, key2) 可以创建 Cipher对象。 

第二个方法多了一个key2,可以理解为是多加了一个key,不过kye2必须是8个字符,多也不行,少也不行。第一个参数algorithm算法是专门用于加密的算法,可以通过crypto.getCiphers() 得到一个算法数组。

var crypto = require("crypto");
var ciphter = crypto.createCipher("bf","111"); 
var ciphter2 = crypto.createCipheriv("bf","111","12345678");

以上代码创建了两个Ciphter对象。

加密数据

通过调用Ciphter对象的update和final可以得到加密后的数据。通过ciphter.update(data)方法加密data数据,然后return返回部分加密的数据,可多次调用update方法,最后调用 ciphter.final() 返回剩余的加密数据。这里要注意的是调用update(data)并不一定返回对应的data加密后的数据,所以正确的流程是,每次调用update,然后把返回的数据相加,最后调用一次final,再把final返回的数据相加,得到完整的加密后的数据。

下面看一个例子:

var crypto = require("crypto");
var ciphter = crypto.createCipher("bf","111");
var s = "";
s += ciphter.update("aaa","utf8","hex");
s += ciphter.update("bbb","utf8","hex");
s += ciphter.update("ccc","utf8","hex");
s += ciphter.final("hex");

是最终加密后的数据,update(要加密的数据,数据的编码,加密后的数据编码), final(加密后的数据编码)。

创建Decipher对象,用于解密。

crypto.createDecipher(algorithm, key) 和 crypto.createDecipheriv(algorithm, key, key2) 对应  crypto.createCipher(algorithm, key) 和 crypto.createCipheriv(algorithm, key, key2) 方法。

var decipher = crypto.createDecipher("bf","111");
解密数据

和加密的方法一模一样,下面举个例子,解密上面加密的例子。

var o = "";
var decipher = crypto.createDecipher("bf","111");
o += decipher.update(s,"hex","utf8");
o += decipher.final("utf8");
console.log(o); // aaabbbccc

分解之后,加密解密其实很简单,即使不知道原理,只要知道怎么用就可以了。