Node.js v0.10.31API手册-加密

加密(Crypto)

使用 require(‘crypto‘) 来调用该模块。

crypto模块提供在HTTPS或HTTP连接中封装安全凭证的方法。

它提供OpenSSL中的一系列哈希方法,包括hmac、cipher、decipher、签名和验证等方法的封装。

crypto.getCiphers()

返回一个数组,包含支持的加密算法的名字。

示例:

var ciphers = crypto.getCiphers();
console.log(ciphers); // [‘AES-128-CBC‘, ‘AES-128-CBC-HMAC-SHA1‘, ...]

crypto.getHashes()

返回一个包含所支持的哈希算法的数组。

示例:

var hashes = crypto.getHashes();
console.log(hashes); // [‘sha‘, ‘sha1‘, ‘sha1WithRSAEncryption‘, ...]

crypto.createCredentials(details)

创建一个加密凭证对象,接受一个可选的参数对象:

  • pfx : 一个字符串或者buffer对象,代表经PFX或者PKCS12编码产生的私钥、证书以及CA证书
  • key : 一个字符串,代表经PEM编码产生的私钥
  • passphrase : 私钥或者pfx的密码
  • cert : 一个字符串,代表经PEM编码产生的证书
  • ca : 一个字符串或者字符串数组,表示可信任的经PEM编码产生的CA证书列表
  • crl : 一个字符串或者字符串数组,表示经PEM编码产生的CRL(证书吊销列表 Certificate Revocation List)
  • ciphers: 一个字符串,表示需要使用或者排除的加密算法 可以在http://www.openssl.org/docs/apps/ciphers.html#CIPHER_LIST_FORMAT 查看更多关于加密算法格式的资料。

如果没有指定ca,node.js会使用http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt提供的公共可信任的CA列表。

crypto.createHash(algorithm)

创建并返回一个哈希对象,一个使用所给算法的用于生成摘要的加密哈希。

algorithm 取决与平台上所安装的
OpenSSL 版本所支持的算法。比如‘sha1‘‘md5‘‘sha256‘‘sha512‘ 等等。在最近的发行版本中,openssl
list-message-digest-algorithms
 会显示可用的摘要算法。

示例:这段程序会计算出一个文件的
sha1 摘要值。

var filename = process.argv[2];
var crypto = require(‘crypto‘);
var fs = require(‘fs‘);

var shasum = crypto.createHash(‘sha1‘);

var s = fs.ReadStream(filename);
s.on(‘data‘, function(d) {
  shasum.update(d);
});

s.on(‘end‘, function() {
  var d = shasum.digest(‘hex‘);
  console.log(d + ‘  ‘ + filename);
});

类: Hash

创建数据哈希摘要的类。

它是一个既可读又可写的。所写入的数据会被用作计算哈希。当流的可写端终止后,使用 read() 方法来获取计算得的哈希摘要。同时也支持旧有的 update 和 digest 方法。

通过 crypto.createHash 返回。

hash.update(data, [input_encoding])

通过提供的数据更新哈希对象,可以通过input_encoding指定编码为‘utf8‘‘ascii‘或者 ‘binary‘。如果没有指定编码,将作为二进制数据(buffer)处理。

因为它是流式数据,所以可以使用不同的数据调用很多次。

hash.digest([encoding])

计算传入的所有数据的摘要值。encoding可以是‘hex‘‘binary‘或者‘base64‘,如果没有指定,会返回一个buffer对象。

注意:hash 对象在 digest() 方法被调用后将不可用。

crypto.createHmac(algorithm, key)

创建并返回一个hmac对象,也就是通过给定的加密算法和密钥生成的加密图谱(cryptographic)。

它是一个既可读又可写的流(stream)。写入的数据会被用于计算hmac。写入终止后,可以使用read()方法获取计算后的摘要值。之前版本的updatedigest方法仍然支持。

algorithm在OpenSSL支持的算法列表中被抛弃了——见上方createHash部分。key是hmac算法用到的密钥。

类: Hmac

用于创建hmac加密图谱(cryptographic)的类。

crypto.createHmac返回。

hmac.update(data)

通过提供的数据更新hmac对象。因为它是流式数据,所以可以使用新数据调用很多次。

hmac.digest([encoding])

计算传入的所有数据的hmac摘要值。encoding可以是‘hex‘‘binary‘或者‘base64‘,如果没有指定,会返回一个buffer对象。

注意: hmac对象在调用digest()之后就不再可用了。

crypto.createCipher(algorithm, password)

用给定的算法和密码,创建并返回一个cipher加密算法的对象。

algorithm算法是依赖OpenSSL库的,
例如: ‘aes192‘算法等。在最近发布的版本,
执行命令 openssl list-cipher-algorithms 就会显示出所有可用的加密算法,password是用来派生key和IV的,它必须是一个‘binary‘ 2进制格式的字符串或者是一个buffer。

它是一个既可读又可写的。所写入的数据会被用作计算哈希。当流的可写端终止后,使用 read() 方法来获取计算得的哈希摘要。同时也支持旧有的 update 和 digest 方法。

crypto.createCipheriv(algorithm, key, iv)

用给定的算法、密码和向量,创建并返回一个cipher加密算法的对象。

algorithm算法和createCipher() 方法的参数相同. key密钥是一个被算法使用的原始密钥,iv是一个初始化向量

key密钥和iv向量必须是‘binary‘2进制格式的字符串或buffers。

类: Cipher

这个类是用来加密数据的。

这个类由 crypto.createCipher 和 crypto.createCipheriv 返回。

Cipher加密对象是 streams,他是具有
readable 可读和 writable 可写的。写入的纯文本数据是用来在可读流一侧加密数据的。 以前版本的update 和final方法也还是支持的。

cipher.update(data, [input_encoding], [output_encoding])

data参数更新cipher加密对象,
它的编码input_encoding必须是下列给定编码的 ‘utf8‘‘ascii‘ or‘binary‘ 中一种。如果没有编码参数,那么打他参数必须是一个buffer。

参数 output_encoding输出编码指定了加密数据的输出格式,可以是‘binary‘‘base64‘ 或者‘hex‘,如果没有提供这个参数,buffer将会返回。

返回加密内容,并且Returns
the enciphered contents, 用新数据作为流的话,它可以被调用多次。

cipher.final([output_encoding])

返回剩余的加密内容,output_encoding‘binary‘‘base64‘ 或 ‘hex‘中的任意一个。
如果没有提供编码格式,则返回一个buffer对象。

注意:
调用final()函数后cipher 对象不能被使用。

cipher.setAutoPadding(auto_padding=true)

对于将输入数据自动填充到块大小的功能,你可以将其禁用。如果auto_padding是false,
那么整个输入数据的长度必须是加密器的块大小的整倍数,否则final会失败。这对非标准的填充很有用,例如使用0x0而不是PKCS的填充。这个函数必须在cipher.final之前调用。

crypto.createDecipher(algorithm, password)

根据给定的算法和密钥,创建并返回一个解密器对象。这是上述createCipher()的一个镜像。

crypto.createDecipheriv(algorithm, key, iv)

根据给定的算法,密钥和初始化向量,创建并返回一个解密器对象。这是上述createCipheriv()的一个镜像。

类: Decipher

解密数据的类。

crypto.createDeciphercrypto.createDecipheriv返回。

解密器对象是可读写的对象。用被写入的加密数据生成可读的平文数据。解码器对象也支持The
legacy update和 final函数。

decipher.update(data, [input_encoding], [output_encoding])

data来更新解密器,其中data‘binary‘‘base64‘ 或 ‘hex‘进行编码。如果没有指明编码方式,则默认data是一个buffer对象。

output_decoding指明了用以下哪种编码方式返回解密后的平文:‘binary‘‘ascii‘ 或 ‘utf8‘。如果没有指明编码方式,则返回一个buffer对象。

decipher.final([output_encoding])

返回剩余的加密内容,output_encoding‘binary‘‘ascii‘ 或 ‘utf8‘中的任意一个。如果没有指明编码方式,则返回一个buffer对象。

注意:
调用final()函数后不能使用decipher 对象。

decipher.setAutoPadding(auto_padding=true)

如果数据以非标准的块填充方式被加密,那么你可以禁用自动填充来防止decipher.final对数据进行检查和移除。这只有在输入数据的长度是加密器块大小的整倍数时才有效。这个函数必须在将数据流传递给decipher.update之前调用。

crypto.createSign(algorithm)

根据给定的算法,创建并返回一个signing对象。在最近的OpenSSL发布版本中,openssl
list-public-key-algorithms
会列出可用的签名算法,例如‘RSA-SHA256‘

类: Sign

生成数字签名的类。

crypto.createSign返回。

Sign对象是可写的对象。被写入的数据用来生成数字签名。当所有的数据都被写入后,sign 函数会返回数字签名。Sign对象也支持The
legacy update函数。

sign.update(data)

data来更新sign对象。新数据是以流的形式时可调用多次。

sign.sign(private_key, [output_format])

根据所有传送给sign的更新数据来计算电子签名。private_key是一个包含了签名私钥的字符串,而该私钥是用PEM编码的。

返回一个数字签名,该签名的格式可以是‘binary‘‘hex‘或 ‘base64‘.
如果没有指明编码方式,则返回一个buffer对象。

注意:调用sign()后不能使用sign对象。

crypto.createVerify(algorithm)

根据指明的算法,创建并返回一个验证器对象。这是上述签名器对象的镜像。

类: Verify

用来验证数字签名的类。

由 crypto.createVerify返回。

验证器对象是可写的对象.
被写入的数据会被用来验证提供的数字签名。在所有的数据被写入后,如果提供的数字签名有效,verify函数会返回真。验证器对象也支持
The legacy update函数。

verifier.update(data)

用数据更新验证器对象。新数据是以流的形式时可调用多次。

verifier.verify(object, signature, [signature_format])

objectsignature来验证被签名的数据。 object是一个字符串,这个字符串包含了一个被PEM编码的对象,这个对象可以是RSA公钥,DSA公钥或者X.509
证书。 signature是之前计算出来的数字签名,其中的signature_format可以是‘binary‘‘hex‘ 或 ‘base64‘.
如果没有指明编码方式,那么默认是一个buffer对象。

根据数字签名对于数据和公钥的有效性,返回true或false。

注意:
调用verify()函数后不能使用verifier对象。

crypto.createDiffieHellman(prime_length)

创建一个迪菲-赫尔曼密钥交换(Diffie-Hellman key exchange)对象,并根据给定的位长度生成一个质数。所用的生成器是2。

crypto.createDiffieHellman(prime, [encoding])

根据给定的质数创建一个迪菲-赫尔曼密钥交换(Diffie-Hellman key exchange)对象。 所用的生成器是2。编码方式可以是‘binary‘‘hex‘或 ‘base64‘。如果没有指明编码方式,则默认是一个buffer对象。

类: DiffieHellman

创建迪菲-赫尔曼密钥交换(Diffie-Hellman key exchanges)的类。

crypto.createDiffieHellman返回。

diffieHellman.generateKeys([encoding])

生成迪菲-赫尔曼(Diffie-Hellman)算法的公钥和私钥,并根据指明的编码方式返回公钥。这个公钥可以转交给第三方。编码方式可以是 ‘binary‘‘hex‘或 ‘base64‘.
如果没有指明编码方式,则返回一个buffer对象。

diffieHellman.computeSecret(other_public_key, [input_encoding], [output_encoding])

other_public_key作为第三方公钥来计算共享秘密,并返回这个共享秘密。参数中的密钥会以input_encoding编码方式来解读,而共享密钥则会用output_encoding进行编码。编码方式可以是‘binary‘,‘hex‘或 ‘base64‘。如果没有提供输入的编码方式,则默认为一个buffer对象。

如果没有指明输出的编码方式,则返回一个buffer对象。

diffieHellman.getPrime([encoding])

根据指明的编码格式返回迪菲-赫尔曼(Diffie-Hellman)质数,其中编码方式可以是‘binary‘‘hex‘ 或‘base64‘。如果没有指明编码方式,则返回一个buffer对象。

diffieHellman.getGenerator([encoding])

根据指明的编码格式返回迪菲-赫尔曼(Diffie-Hellman)质数,其中编码方式可以是‘binary‘‘hex‘ 或‘base64‘。如果没有指明编码方式,则返回一个buffer对象。

diffieHellman.getPublicKey([encoding])

根据指明的编码格式返回迪菲-赫尔曼(Diffie-Hellman)公钥,其中编码方式可以是‘binary‘‘hex‘ 或‘base64‘
如果没有指明编码方式,则返回一个buffer对象。

diffieHellman.getPrivateKey([encoding])

根据指明的编码格式返回迪菲-赫尔曼(Diffie-Hellman)私钥,其中编码方式可以是‘binary‘‘hex‘ 或‘base64‘。如果没有指明编码方式,则返回一个buffer对象。

diffieHellman.setPublicKey(public_key, [encoding])

设置迪菲-赫尔曼(Diffie-Hellman)公钥,编码方式可以是可以是‘binary‘‘hex‘ 或 ‘base64‘。如果没有指明编码方式,则返回一个buffer对象。

diffieHellman.setPrivateKey(private_key, [encoding])

设置迪菲-赫尔曼(Diffie-Hellman)私钥,编码方式可以是可以是‘binary‘‘hex‘ 或 ‘base64‘。如果没有指明编码方式,则返回一个buffer对象。

crypto.getDiffieHellman(group_name)

创建一个预定义的迪菲-赫尔曼密钥交换(Diffie-Hellman key exchanges)对象。支持以下的D-H组:‘modp1‘,‘modp2‘‘modp5‘ (在RFC
2412
中定义) 和 ‘modp14‘‘modp15‘‘modp16‘‘modp17‘‘modp18‘ (在 RFC
3526
中定义)。返回的对象模仿了上述 crypto.createDiffieHellman()方法所创建的对象的接口,但不会晕允许密钥交换
(例如像 diffieHellman.setPublicKey()那样)。执行这套流程的好处是双方不需要事先生成或交换组余数,节省了处理和通信时间。

示例(获取一个共享秘密):

var crypto = require(‘crypto‘);
var alice = crypto.getDiffieHellman(‘modp5‘);
var bob = crypto.getDiffieHellman(‘modp5‘);

alice.generateKeys();
bob.generateKeys();

var alice_secret = alice.computeSecret(bob.getPublicKey(), null, ‘hex‘);
var bob_secret = bob.computeSecret(alice.getPublicKey(), null, ‘hex‘);

/* alice_secret and bob_secret should be the same */
console.log(alice_secret == bob_secret);

crypto.pbkdf2(password, salt, iterations, keylen, callback)

异步PBKDF2提供了一个伪随机函数 HMAC-SHA1,根据给定密码的长度,salt和iterations来得出一个密钥。回调函数得到两个参数 (err,
derivedKey)

crypto.pbkdf2Sync(password, salt, iterations, keylen)

同步 PBKDF2 函数。返回derivedKey或抛出一个错误。

crypto.randomBytes(size, [callback])

生成密码学强度的伪随机数据。用法:

// async
crypto.randomBytes(256, function(ex, buf) {
  if (ex) throw ex;
  console.log(‘Have %d bytes of random data: %s‘, buf.length, buf);
});

// sync
try {
  var buf = crypto.randomBytes(256);
  console.log(‘Have %d bytes of random data: %s‘, buf.length, buf);
} catch (ex) {
  // handle error
  // most likely, entropy sources are drained
}

注意:
将抛出错误或调用回调有错误,如果没有足够的积累了熵产生强加密的数据。换句话说,crypto.randombytes没有回调不会阻止即使所有的熵源排放。

crypto.pseudoRandomBytes(size, [callback])

生成非密码学强度的伪随机数据。如果数据足够长的话会返回一个唯一的数据,但这个返回值不一定是不可预料的。基于这个原因,当不可预料性很重要时,这个函数的返回值永远都不应该被使用,例如在生成加密的密钥时。

用法与 crypto.randomBytes一模一样。

crypto.DEFAULT_ENCODING

对于可以接受字符串或buffer对象的函数的默认编码方式。默认值是‘buffer‘,所以默认使用Buffer对象。这是为了让crypto模块与默认‘binary‘为编码方式的遗留程序更容易兼容。

要注意,新的程序会期待buffer对象,所以使用这个时请只作为暂时的手段。

Recent API Changes

早在统一的流API概念出现,以及引入Buffer对象来处理二进制数据之前,Crypto模块就被添加到Node。

因为这样,与流有关的类中并没有其它Node类的典型函数,而且很多函数接受和返回默认的二进制编码的字符串,而不是Buffer对象。在最近的修改中,这些函数都被改成默认使用Buffer对象。

这对于某些(但不是全部)使用场景来讲是重大的改变。

例如,如果你现在使用Sign类的默认参数,然后在没有检查数据的情况下,将结果传递给Verify类,那么程序会照常工作。在以前,你会拿到一个二进制字符串,然后它传递给Verify对象;而现在,你会得到一个Buffer对象,然后把它传递给Verify对象。

但是,如果你以前是使用那些在Buffer对象上不能正常工作的字符串数据,或者以默认编码方式将二进制数据传递给加密函数的话,那你就要开始提供编码方式参数来指明你想使用的编码方式了。如果想准换回旧的风格默认使用二进制字符串,那么你需要把crypto.DEFAULT_ENCODING字段设为‘binary‘。但请注意,因为新的程序很可能会期望buffer对象,所以仅将此当做临时手段。

时间: 2024-09-30 10:42:06

Node.js v0.10.31API手册-加密的相关文章

Node.js v0.10.31API手册-Domain

Node.js v0.10.31API手册-目录 Domain(域) Domains 提供了一种方式,即以一个单一的组的形式来处理多个不同的IO操作.如果任何一个注册到domain的事件触发器或回调触发了一个'error'事件,或者抛出一个错误,那么domain对象将会被通知到.而不是直接让这个错误的上下文从`process.on('uncaughtException')'处理程序中丢失掉,也不会致使程序因为这个错误伴随着错误码立即退出. 警告: 不要忽视错误! Domain error处理程序

Node.js v0.10.31API手册-事件

Node.js v0.10.31API手册-目录 Events(事件) Node里面的许多对象都会分发事件:一个net.Server对象会在每次有新连接时分发一个事件, 一个fs.readStream对象会在文件被打开的时候发出一个事件. 所有这些产生事件的对象都是events.EventEmitter的实例. 你可以通过require("events")来访问该模块. 通常,事件名是驼峰命名 (camel-cased) 的字符串.不过也没有强制的要求,任何字符串都是可以使用的. 为了

Node.js v0.10.31API手册-DNS

原API变化,故译文与之前译文样式上有所不同 Node.js v0.10.31API手册-目录 DNS 使用 require('dns') 引入此模块.dns 模块中的所有方法都使用了 C-Ares,除了 dns.lookup 使用了线程池中的 getaddrinfo(3).C-Ares 比 getaddrinfo 要快得多,但系统解析器相对于其它程序的操作要更固定.当一个用户使用 net.connect(80, 'google.com') 或 http.get({ host: 'google.

Node.js v0.10.31API手册-目录

这段时间,想找些新的技术学习学习,看上了Node.js,万丈高楼平地起,这就从它的API开始,然后就顺便翻译一下. Node.js v0.10.31API手册-简介 Node.js v0.10.31API手册-断言 Node.js v0.10.31API手册-Buffer Node.js v0.10.31API手册-Addons插件 持续更新中...

Node.js v0.10.31API手册-集群

集群 单个 Node 实例运行在单个线程中.要发挥多核系统的能力,用户有时候需要启动一个 Node 进程集群来处理负载. 集群模块允许你方便地创建一个共享服务器端口的进程网络. var cluster = require('cluster'); var http = require('http'); var numCPUs = require('os').cpus().length; if (cluster.isMaster) { // Fork workers. for (var i = 0;

Node.js v0.10.31API手册-子进程

子进程 Node 通过 child_process 模块提供了类似 popen(3) 的处理三向数据流(stdin/stdout/stderr)的功能. 它能够以完全非阻塞的方式与子进程的 stdin.stdout 和 stderr 以流式传递数据.(请注意,某些程序在内部使用行缓冲 I/O.这不会影响到 node.js,但您发送到子进程的数据不会被立即消费.) 使用 require('child_process').spawn()或者 require('child_process').fork

Node.js v0.10.31API手册-Addons插件

Addons Addons插件就是动态连接库.Addons插件将Node与C库和C++库链接起来.它的API(目前来说)相当复杂,涉及到了几个类库的知识. V8 JavaScript引擎是一个 C++ 类库..用于和JavaScript进行交互的接口.创建对象, 调用函数等. 文档大部分在这里:v8.h 头文件 (deps/v8/include/v8.h在Node源代码目录里), 也有可用的线上文档线上. libuv, C语言编写的事件循环类库.任何时候需要等待一个文件描述符变为可读状态,等待一

Node.js v0.10.31API手册-控制台

控制台 Object 用于向 stdout 和 stderr 打印字符.类似于大部分 Web 浏览器提供的 console 对象函数,在这里则是输出到 stdout 或 stderr. 当输出目标是一个终端或者文件时,console函数是同步的(为了防止过早退出时丢失信息).当输出目标是一个管道时它们是异步的(防止阻塞过长时间). 也就是说,在下面的例子中,stdout 是非阻塞的,而 stderr 则是阻塞的. $ node script.js 2> error.log | tee info.

Node.js v0.10.31API手册-Debugger

Debugger V8 提供了一个强大的调试器,可以通过 TCP 协议从外部访问.Node 内建了这个调试器的客户端.要使用调试器,以 debug 参数启动 Node,出现提示符: % node debug myscript.js < debugger listening on port 5858 connecting... ok break in /home/indutny/Code/git/indutny/myscript.js:1 1 x = 5; 2 setTimeout(functio