博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Node.js v0.10.31API手冊-加密
阅读量:2231 次
发布时间:2019-05-09

本文共 9746 字,大约阅读时间需要 32 分钟。

加密(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的password
  • cert : 一个字符串,代表经PEM编码产生的证书
  • ca : 一个字符串或者字符串数组,表示可信任的经PEM编码产生的CA证书列表
  • crl : 一个字符串或者字符串数组,表示经PEM编码产生的CRL(证书吊销列表 Certificate Revocation List)
  • ciphers: 一个字符串。表示须要使用或者排除的加密算法 能够在 查看很多其它关于加密算法格式的资料。

假设没有指定
ca
,node.js会使用
提供的公共可信任的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)。

它是一个既可读又可写的流()。

写入的数据会被用于计算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'
,假设没有指定。会返回一个对象。

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

crypto.createCipher(algorithm, password)

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

algorithm算法是依赖OpenSSL库的, 比如: 'aes192'算法等。

在近期公布的版本号。 运行命令 openssl list-cipher-algorithms 就会显示出全部可用的加密算法。password是用来派生key和IV的。它必须是一个'binary' 2进制格式的字符串或者是一个buffer

它是一个既可读又可写的。所写入的数据会被用作计算哈希。

当流的可写端终止后,使用 read() 方法来获取计算得的哈希摘要。同一时候也支持旧有的 update 和 digest 方法。

crypto.createCipheriv(algorithm, key, iv)

用给定的算法、password和向量,创建并返回一个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)

依据给定的算法和密钥,创建并返回一个解密器对象。

这是上述的一个镜像。

crypto.createDecipheriv(algorithm, key, iv)

依据给定的算法,密钥和初始化向量。创建并返回一个解密器对象。

这是上述的一个镜像。

类: 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])

object
signature
来验证被签名的数据。 
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'
 (在
中定义) 和 
'modp14'
'modp15'
'modp16'
'modp17'
'modp18'
 (在 
中定义)。

返回的对象模仿了上述 

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,依据给定password的长度,salt和iterations来得出一个密钥。回调函数得到两个參数 
(err, derivedKey)

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

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

crypto.randomBytes(size, [callback])

生成password学强度的伪随机数据。

使用方法:

// asynccrypto.randomBytes(256, function(ex, buf) {
if (ex) throw ex; console.log('Have %d bytes of random data: %s', buf.length, buf);});// synctry {
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])

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

使用方法与 crypto.randomBytes一模一样。

crypto.DEFAULT_ENCODING

对于能够接受字符串或buffer对象的函数的默认编码方式。默认值是
'buffer'
,所以默认使用Buffer对象。

这是为了让crypto模块与默认

'binary'
为编码方式的遗留程序更easy兼容。

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

Recent API Changes

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

由于这样,与流有关的类中并没有其他Node类的典型函数,并且非常多函数接受和返回默认的二进制编码的字符串,而不是Buffer对象。

在近期的改动中。这些函数都被改成默认使用Buffer对象。

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

比如。假设你如今使用Sign类的默认參数,然后在没有检查数据的情况下,将结果传递给Verify类,那么程序会照常工作。

在曾经,你会拿到一个二进制字符串。然后它传递给Verify对象;而如今,你会得到一个Buffer对象,然后把它传递给Verify对象。

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

转载于:https://www.cnblogs.com/ljbguanli/p/7260016.html

你可能感兴趣的文章
Intellij IDEA使用(四)—— 使用Intellij IDEA创建静态的web(HTML)项目
查看>>
Intellij IDEA使用(五)—— Intellij IDEA在使用中的一些其他常用功能或常用配置收集
查看>>
Intellij IDEA使用(六)—— 使用Intellij IDEA创建Java项目并配置jar包
查看>>
Eclipse使用(十)—— 使用Eclipse创建简单的Maven Java项目
查看>>
Eclipse使用(十一)—— 使用Eclipse创建简单的Maven JavaWeb项目
查看>>
Intellij IDEA使用(十三)—— 在Intellij IDEA中配置Maven
查看>>
面试题 —— 关于main方法的十个面试题
查看>>
集成测试(一)—— 使用PHP页面请求Spring项目的Java接口数据
查看>>
使用Maven构建的简单的单模块SSM项目
查看>>
Intellij IDEA使用(十四)—— 在IDEA中创建包(package)的问题
查看>>
FastDFS集群架构配置搭建(转载)
查看>>
HTM+CSS实现立方体图片旋转展示效果
查看>>
FFmpeg 命令操作音视频
查看>>
问题:Opencv(3.1.0/3.4)找不到 /opencv2/gpu/gpu.hpp 问题
查看>>
目的:使用CUDA环境变量CUDA_VISIBLE_DEVICES来限定CUDA程序所能使用的GPU设备
查看>>
问题:Mysql中字段类型为text的值, java使用selectByExample查询为null
查看>>
程序员--学习之路--技巧
查看>>
解决问题之 MySQL慢查询日志设置
查看>>
contOS6 部署 lnmp、FTP、composer、ThinkPHP5、docker详细步骤
查看>>
TP5.1模板布局中遇到的坑,配置完不生效解决办法
查看>>