nodeJS之crypto加密


加密模块提供了 HTTP 或 HTTPS 连接过程中封装安全凭证的方法。也提供了 OpenSSL 的哈希,hmac, 加密(cipher), 解密(decipher), 签名(sign) 和 验证(verify) 方法的封装。本文将详细介绍加密crypto【crypto.setEngine(engine[, flags])】  为某些/所有 OpenSSL 函数加载并设置引擎(根据参数 flags 来设置)。  engine 可能是 id,或者是指向引擎共享库的路径。  flags是可选参数,默认值是ENGINE_METHOD_ALL ,可以是以下一个或多个参数的组合(在constants里定义)【crypto.getCiphers()】  返回支持的加密算法名数组【crypto.getCiphers()】  返回支持的哈希算法名数组。【crypto.getCurves()】  返回支持的椭圆曲线名数组。  MD5是一种常用的哈希算法,用于给任意数据一个“签名”。这个签名通常用一个十六进制的字符串表示:【crypto.createHash(algorithm)】  创建并返回一个哈希对象,使用指定的算法来生成哈希摘要。  参数 algorithm 取决于平台上 OpenSSL 版本所支持的算法。例如,’sha1′, ‘md5’, ‘sha256’, ‘sha512’ 等等【hash.update(data[, input_encoding])】  根据 data 来更新哈希内容,编码方式根据 input_encoding 来定,有 ‘utf8’, ‘ascii’ 或 ‘binary’。如果没有传入值,默认编码方式是’utf8’。如果 data 是 Buffer, input_encoding 将会被忽略。  因为它是流式数据,所以可以使用不同的数据调用很多次。【hash.digest([encoding])】  计算传入的数据的哈希摘要。encoding 可以是 ‘hex’, ‘binary’ 或 ‘base64’,如果没有指定encoding ,将返回 buffer。  [注意]调用 digest() 后不能再用 hash 对象。  Hmac算法也是一种哈希算法,它可以利用MD5或SHA1等哈希算法。不同的是,Hmac还需要一个密钥:【crypto.createHmac(algorithm, key)】  创建并返回一个 hmac 对象,用指定的算法和秘钥生成 hmac 图谱。  它是可读写的流 stream 。写入的数据来用计算 hmac。当写入流结束后,使用 read() 方法来获取计算后的值。也支持老的 update 和 digest 方法。  参数 algorithm 取决于平台上 OpenSSL 版本所支持的算法,参见前面的 createHash。key是 hmac 算法中用的 key【hmac.update(data)】  根据 data 更新 hmac 对象。因为它是流式数据,所以可以使用新数据调用多次。【hmac.digest([encoding])】  计算传入数据的 hmac 值。encoding可以是 ‘hex’, ‘binary’ 或 ‘base64’,如果没有指定encoding ,将返回 buffer。  [注意]调用 digest() 后不能再用 hmac 对象  AES是一种常用的对称加密算法,加解密都用同一个密钥。crypto模块提供了AES支持,但是需要自己封装好函数,便于使用:【crypto.createCipher(algorithm, password)】  使用传入的算法和秘钥来生成并返回加密对象。  algorithm 取决于 OpenSSL,例如’aes192’等。password 用来派生 key 和 IV,它必须是一个’binary’ 编码的字符串或者一个buffer。  它是可读写的流 stream 。写入的数据来用计算 hmac。当写入流结束后,使用 read() 方法来获取计算后的值。也支持老的update 和 digest 方法。【cipher.update(data[, input_encoding][, output_encoding])】  根据 data 来更新哈希内容,编码方式根据 input_encoding 来定,有 ‘utf8’, ‘ascii’ or ‘binary’。如果没有传入值,默认编码方式是’binary’。如果data 是 Buffer,input_encoding 将会被忽略。  output_encoding 指定了输出的加密数据的编码格式,它可用是 ‘binary’, ‘base64’ 或 ‘hex’。如果没有提供编码,将返回 buffer 。  返回加密后的内容,因为它是流式数据,所以可以使用不同的数据调用很多次。【cipher.final([output_encoding])】  返回加密后的内容,编码方式是由 output_encoding 指定,可以是 ‘binary’, ‘base64’ 或 ‘hex’。如果没有传入值,将返回 buffer。  [注意]cipher 对象不能在 final() 方法之后调用。【crypto.createDecipher(algorithm, password)】  根据传入的算法和密钥,创建并返回一个解密对象。这是 createCipher() 的镜像【decipher.update(data[, input_encoding][, output_encoding])】  使用参数 data 更新需要解密的内容,其编码方式是 ‘binary’,’base64′ 或 ‘hex’。如果没有指定编码方式,则把 data 当成 buffer 对象。  如果 data 是 Buffer,则忽略 input_encoding 参数。  参数 output_decoding 指定返回文本的格式,是 ‘binary’, ‘ascii’ 或 ‘utf8’ 之一。如果没有提供编码格式,则返回 buffer。【deci免费云主机域名pher.final([output_encoding])】  返回剩余的解密过的内容,参数 output_encoding 是 ‘binary’, ‘ascii’ 或 ‘utf8’,如果没有指定编码方式,返回 buffer。  [注意]decipher对象不能在 final() 方法之后使用。  可以看出,加密后的字符串通过解密又得到了原始内容。  注意到AES有很多不同的算法,如aes192aes-128-ecbaes-256-cbc等,AES除了密钥外还可以指定IV(Initial Vector),不同的系统只要IV不同,用相同的密钥加密相同的数据得到的加密结果也是不同的。加密结果通常有两种表示方法:hex和base64,这些功能Nodejs全部都支持,但是在应用中要注意,如果加解密双方一方用Nodejs,另一方用Java、PHP等其它语言,需要仔细测试。如果无法正确解密,要确认双方是否遵循同样的AES算法,字符串密钥和IV是否相同,加密后的数据是否统一为hex或base64格式【crypto.createCipheriv(algorithm, key, iv)】  创建并返回一个加密对象,用指定的算法,key 和 iv。  algorithm 参数和 createCipher() 一致。key 在算法中用到.iv 是一个initialization vector.  key 和 iv 必须是 ‘binary’ 的编码字符串或buffers.【crypto.createDecipheriv(algorithm, key, iv)】  根据传入的算法,密钥和 iv,创建并返回一个解密对象。这是 createCipheriv() 的镜像。【crypto.createDiffieHellman(prime[, prime_encoding][, generator][, generator_encoding])】  使用传入的 prime 和 generator 创建 Diffie-Hellman 秘钥交互对象。  generator 可以是数字,字符串或Buffer。如果没有指定 generator,使用 2  prime_encoding 和 generator_encoding 可以是 ‘binary’, ‘hex’, 或 ‘base64’。  如果没有指定 prime_encoding, 则 Buffer 为 prime。如果没有指定 generator_encoding ,则 Buffer 为 generator。【diffieHellman.generateKeys([encoding])】  生成秘钥和公钥,并返回指定格式的公钥。这个值必须传给其他部分。编码方式: ‘binary’, ‘hex’, 或 ‘base64’。如果没有指定编码方式,将返回 buffer。【diffieHellman.getPrime([encoding])】  用参数 encoding 指明的编码方式返回 Diffie-Hellman 质数,编码方式为: ‘binary’, ‘hex’, 或 ‘base64’。 如果没有指定编码方式,将返回 buffer。【diffieHellman.getGenerator([encoding])】  用参数 encoding 指明的编码方式返回 Diffie-Hellman 生成器,编码方式为: ‘binary’, ‘hex’, 或 ‘base64′. 如果没有指定编码方式 ,将返回 buffer。【diffieHellman.computeSecret(other_public_key[, input_encoding][, output_encoding])】  使用 other_public_key 作为第三方公钥来计算并返回共享秘密(shared secret)。秘钥用input_encoding 编码。编码方式为:’binary’, ‘hex’, 或 ‘base64’。如果没有指定编码方式 ,默认为 buffer。  如果没有指定返回编码方式,将返回 buffer。DH算法  DH算法是一种密钥交换协议,它可以让双方在不泄漏密钥的情况下协商出一个密钥来。DH算法基于数学原理,比如小明和小红想要协商一个密钥,可以这么做:  1、小明先选一个素数和一个底数,例如,素数p=23,底数g=5(底数可以任选),再选择一个秘密整数a=6,计算A=g^a mod p=8,然后大声告诉小红:p=23,g=5,A=8;  2、小红收到小明发来的p,g,A后,也选一个秘密整数b=15,然后计算B=g^b mod p=19,并大声告诉小明:B=19;  3、小明自己计算出s=B^a mod p=2,小红也自己计算出s=A^b mod p=2,因此,最终协商的密钥s为2。  在这个过程中,密钥2并不是小明告诉小红的,也不是小红告诉小明的,而是双方协商计算出来的。第三方只能知道p=23,g=5,A=8,B=19,由于不知道双方选的秘密整数a=6和b=15,因此无法计算出密钥2。  用crypto模块实现DH算法如下:  [注意]每次输出都不一样,因为素数的选择是随机的。

相关推荐: 华为交换机/路由器用户名密码配置

用户验证方式:Password验证:只需输入密码免费云主机域名AAA验证:需输入用户名/密码用户权限分级:用户权限分为 0-15共16个级别。默认情况下3级用户就可以操作VRP系统的所以命令,也就是说4-15级的用户在默认情况下是与3级用户权限一致的。VTY用…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 02/01 10:09
下一篇 02/01 10:09