• NodeJS之crypto模块公钥加密及解密


      NodeJS有以下4个与公钥加密相关的类。

      Cipher: 用于加密数据;

      Decipher: 用于解密数据;

      Sign: 用于生成签名;

      Verify: 用于验证签名;

      在使用公钥加密技术时,需要使用公钥及私钥:公钥是用于创建只有私钥的拥有者能够读出的加密数据,以及对私钥的拥有者的签名进行验证;私钥是用于解密数据以及对数据进行签名。

    一、加密数据

      在crypto模块中,Cipher类用于对数据进行加密操作;我们可以通过如下两种方式创建cipher对象;

    1、createCipher方法;

      该方法使用指定的算法与密码来创建cipher对象。该方法使用方式如下:crypto.createCipher(params, pasword);

      该方法使用两个参数,第一个参数用于指定在加密数据时所使用的算法,比如 'aes-256-cbc'这些等,第二个参数用于指定加密时所使用的密码,该参数值必须为一个二进制格式的字符串或一个Buffer对象。

      createCipher 方法返回一个被创建的cipher对象。

    2、createCipheriv方法;

      该方法使用指定的算法、密码与初始向量、来创建cipher对象,使用方法如下所示:crypto.createCipheriv(params, password, iv);

      该方法的第一个参数是在加密数据时所使用的算法,比如 'aes-256-cbc'等等,

      第二个参数用于指定加密时所使用的密码,该参数值必须为一个二进制格式的字符串或一个Buffer对象。

       第三个参数指定加密时所使用的初始向量,参数值也必须为一个二进制格式的字符串或一个Buffer对象。

      该方法返回的也是一个被创建的cipher对象。

    3、在上面通过两种方式创建了cipher对象后,可以通过使用该对象的update方法来指定需要被加密的数据,该方法使用的方式如下:cipher.update(data, [input_encoding], [output_encoding])

      其中第一个参数为必选项(其他的参数为可选项), 该参数值是一个Buffer对象或一个字符串,用于指定需要加密的数据。

      第二个参数用于指定被加密的数据所使用的编码格式,可指定参数值为 'utf-8', 'ascii' 或 'binary',如果不使用第二个参数的话,那么第一个参数必须为一个Buffer对象。

      第三个参数用于指定输出加密数据时使用的编码格式,可指定的参数值为 'hex', 'binary' 或 'base64' 等。如果不使用第三个参数的话,该方法就返回了一个存放了加密数据的Buffer对象。

    4、可以使用cipher对象的final方法来返回加密数据。

      当该方法被调用时,任何cipher对象中所缓存的数据都将被加密。在使用了cipher对象的final方法后,不能再向cipher对象中追加加密数据,该方法使用方式如下:cipher.final([output_encoding]);

      该方法使用一个可选参数,该参数值为一个字符串,用于指定在输出加密数据的编码格式,可指定参数值为 'hex', 'binary', 及 'base64',如果使用了该参数,那么final方法返回字符串格式的加密数据,如果不使用该参数,那么该方法就返回一个Buffer对象。

    二、解密数据

      在crypto模块中,Decipher类用于对加密后的数据进行解密操作。

      创建一个decipher对象,可以通过如下两种方式进行创建:

    1、createDecipher方法,该方法使用指定的算法与密码来创建 decipher对象,该方法使用的方式如下:crypto.createDecipher(params, password);

      在该方法中,第一个参数用于指定在解密数据时所使用的算法,比如 'aes-256-cbc'等,该算法必须与加密数据时所使用的算法保持一致。

      第二个参数用于指定解密时所使用的密码,其参数值为一个二进制格式的字符串或一个Buffer对象,该密码同样必须与加密该数据时所使用的密码保持一致。

      createDecipher方法返回一个被创建的 decipher对象。

    2、createDecipheriv方法;该方法使用指定的算法、密码与初始向量来创建decipher对象。该方法使用如下所示:crypto.createDecipheriv(params, password, iv);

      在该方法中,第一个参数用于指定在解密数据时所使用的算法,比如 'aes-256-cbc'等,该算法必须与加密数据时所使用的算法保持一致。

      第二个参数用于指定解密时所使用的密码,参数值必须为一个二进制格式的字符串或一个Buffer对象,同样的道理,该密码必须与加密该数据时所使用的密码保持一致。 
      第三个参数用于指定解密时所使用的初始向量,该参数值也必须为一个二进制格式的字符串或者一个Buffer对象,该初始向量必须与加密该数据时所使用的初始向量保持一致。

    3、在创建了decipher对象之后,可以通过使用该对象的update方法来指定需要被解密的数据。该方法使用如下所示:decipher.update(data, [input_encoding], [output_encoding]);

      在该方法中,第一个参数为一个Buffer对象或一个字符串,用于指定需要被解密的数据,

      第二个参数用于指定被解密数据所使用的编码格式,可指定的参数值为 'hex', 'binary', 'base64'等,如果不使用第二个参数的话,那么参数值必须为一个buffer对象

      第三个参数用于指定输出解密数据时使用的编码格式,可选参数值为'utf-8', 'ascii' 或 'binary';

    4、可以使用decipher对象的final方法来返回经过解密之后的原始数据,该方法使用如下所示:decipher.final([output_encoding]);

      在该对象的final方法中,使用了一个可选参数,参数值为一个字符串,用于指定在输出解密数据时使用的编码格式,可指定参数值为 'utf-8', 'ascii' 或 'binary';
    如果使用了 该参数,final返回字符串格式的解密数据,如果不使用该参数,final方法返回一个Buffer对象。

    5、如下加密解密数据的代码:

    const crypto = require('crypto');
    /*
     下面是使用加密算法对 '我很棒' 几个字进行加密,所加密使用的密码是 123456
    */
    const data = '我很棒';
    const password = '123456';
    // 创建加密算法
    const aseEncode = function(data, password) {
      // 如下方法使用指定的算法与密码来创建cipher对象
      const cipher = crypto.createCipher('aes-256-cbc', password);
      // 使用该对象的update方法来指定需要被加密的数据
      let crypted = cipher.update(data, 'utf-8', 'hex');
      crypted += cipher.final('hex');
      return crypted;
    };
    console.log(aseEncode(data, password)); // 输出加密后字符串
    
    // 创建解密算法
    const aseDecode = function(data, password) {
      /* 
       该方法使用指定的算法与密码来创建 decipher对象, 第一个算法必须与加密数据时所使用的算法保持一致;
       第二个参数用于指定解密时所使用的密码,其参数值为一个二进制格式的字符串或一个Buffer对象,该密码同样必须与加密该数据时所使用的密码保持一致
      */
      const decipher = crypto.createDecipher('aes-256-cbc', password);
      /*
       第一个参数为一个Buffer对象或一个字符串,用于指定需要被解密的数据
       第二个参数用于指定被解密数据所使用的编码格式,可指定的参数值为 'hex', 'binary', 'base64'等,
       第三个参数用于指定输出解密数据时使用的编码格式,可选参数值为 'utf-8', 'ascii' 或 'binary';
      */
      let decrypted = decipher.update(data, 'hex', 'utf-8');
      decrypted += decipher.final('utf-8');
      return decrypted;
    }; 
    console.log(aseDecode(aseEncode(data, password), password)); // 输出  我很棒
  • 相关阅读:
    MySQL事务处理2
    servlet过滤器配置白名单、黑名单
    Freemarker生成静态代码实例
    FreeMarker---数据类型
    创建第一个freemarker
    JDBC编程之优化
    关于ComponentName的使用
    launchMode使用详解
    android开发之使用上下文菜单
    android开发之shape详解
  • 原文地址:https://www.cnblogs.com/goloving/p/12732677.html
Copyright © 2020-2023  润新知