• nodejs中常用加密算法


    在常用的nodejs+express工程中,为了安全在登录及表单传输时,应该都需进行加密传输,目前个人常用到的加密方式有下列几种:

    1、Hash算法加密:

        创建一个nodejs文件hash.js,输入内容如下:

    1 var crypto = require('crypto');  //加载crypto库
    2 console.log(crypto.getHashes()); //打印支持的hash算法

      结果如下:

     1 [ 'DSA',
     2   'DSA-SHA',
     3   'DSA-SHA1',
     4   'DSA-SHA1-old',
     5   'RSA-MD4',
     6   'RSA-MD5',
     7   'RSA-MDC2',
     8   'RSA-RIPEMD160',
     9   'RSA-SHA',
    10   'RSA-SHA1',
    11   'RSA-SHA1-2',
    12   'RSA-SHA224',
    13   'RSA-SHA256',
    14   'RSA-SHA384',
    15   'RSA-SHA512',
    16   'dsaEncryption',
    17   'dsaWithSHA',
    18   'dsaWithSHA1',
    19   'dss1',
    20   'ecdsa-with-SHA1',
    21   'md4',
    22   'md4WithRSAEncryption',
    23   'md5',
    24   'md5WithRSAEncryption',
    25   'mdc2',
    26   'mdc2WithRSA',
    27   'ripemd',
    28   'ripemd160',
    29   'ripemd160WithRSA',
    30   'rmd160',
    31   'sha',
    32   'sha1',
    33   'sha1WithRSAEncryption',
    34   'sha224',
    35   'sha224WithRSAEncryption',
    36   'sha256',
    37   'sha256WithRSAEncryption',
    38   'sha384',
    39   'sha384WithRSAEncryption',
    40   'sha512',
    41   'sha512WithRSAEncryption',
    42   'shaWithRSAEncryption',
    43   'ssl2-md5',
    44   'ssl3-md5',
    45   'ssl3-sha1',
    46   'whirlpool' ]
    View Code

      在nodejs中使用:(createHash('md5')中的‘md5’可以换成袭击需要的hash加密方法)

    1     var content = 'password';//加密的明文;
    2     var md5 = crypto.createHash('md5');//定义加密方式:md5不可逆,此处的md5可以换成任意hash加密的方法名称;
    3     md5.update(content);
    4     var d = md5.digest('hex');  //加密后的值d
    5     console.log("加密的结果:"+d);
    2、Hmac算法加密:(主要用)

    HMAC是密钥相关的哈希运算消息认证码(Hash-based Message Authentication Code),HMAC运算利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出。HMAC可以有效防止一些类似md5的彩虹表等攻击,比如一些常见的密码直接MD5存入数据库的,可能被反向破解。

    定义HMAC需要一个加密用散列函数(表示为H,可以是MD5或者SHA-1)和一个密钥K。我们用B来表示数据块的字节数。(以上所提到的散列函数的分割数据块字长B=64),用L来表示散列函数的输出数据字节数(MD5中L=16,SHA-1中L=20)。鉴别密钥的长度可以是小于等于数据块字长的任何正整数值。应用程序中使用的密钥长度若是比B大,则首先用使用散列函数H作用于它,然后用H输出的L长度字符串作为在HMAC中实际使用的密钥。一般情况下,推荐的最小密钥K长度是L个字节。

     下面为我在项目中使用到的Hmac加密(采用sha1方式):(由于密钥会通过随机生成的16位数进行加密后再对明文加密,每次生成的新密钥(token)都不同,所以最后生成的密文也不会相同,这种加密不可逆,

    即使为md5方式,也难以通过彩虹表来攻击)

    /********hmac-sha1加密***************/
        var content = 'password';//加密的明文;
        var token1='miyue';//加密的密钥;
        var buf = crypto.randomBytes(16);
        token1 = buf.toString('hex');//密钥加密;
            console.log("生成的token(用于加密的密钥):"+token1);
        var SecrectKey=token1;//秘钥;
        var Signture = crypto.createHmac('sha1', SecrectKey);//定义加密方式
        Signture.update(content);
        var miwen=Signture.digest().toString('base64');//生成的密文后将再次作为明文再通过pbkdf2算法迭代加密;
        console.log("加密的结果f:"+miwen);
    
    
    /**********对应的结果(每次生成的结果都不一样)******************/
    生成的token(用于加密的密钥):de7c3dafede518a1ad9c2096ee9b4eff
    加密的结果f:PUX7fnOMlqVj+BS9o6RnNgxfffY=

      生成的token(用于加密的密钥):93fee046ebf47412c2d54c1e808218d2
      加密的结果f:/ERkUcrjkwxzgxNM7WczU8RaX5o=

    3、对称加密和非对称加密:

    • 对称加密算法的原理很容易理解,通信一方用KEK加密明文,另一方收到之后用同样的KEY来解密就可以得到明文。
    • 不对称加密算法,使用两把完全不同但又是完全匹配的一对Key:公钥和私钥。在使用不对称加密算法加密文件时,只有使用匹配的一对公钥和私钥,才能完成对明文的加密和解密过程。

     3.1:对称加密:

       创建一个nodejs文件cipher.js,输入内容如下:

    var crypto = require('crypto');  //加载crypto库
    console.log(crypto.getCiphers()); //打印支持的cipher算法
    结果如下:
      1 [ 'CAST-cbc',
      2   'aes-128-cbc',
      3   'aes-128-cfb',
      4   'aes-128-cfb1',
      5   'aes-128-cfb8',
      6   'aes-128-ctr',
      7   'aes-128-ecb',
      8   'aes-128-gcm',
      9   'aes-128-ofb',
     10   'aes-128-xts',
     11   'aes-192-cbc',
     12   'aes-192-cfb',
     13   'aes-192-cfb1',
     14   'aes-192-cfb8',
     15   'aes-192-ctr',
     16   'aes-192-ecb',
     17   'aes-192-gcm',
     18   'aes-192-ofb',
     19   'aes-256-cbc',
     20   'aes-256-cfb',
     21   'aes-256-cfb1',
     22   'aes-256-cfb8',
     23   'aes-256-ctr',
     24   'aes-256-ecb',
     25   'aes-256-gcm',
     26   'aes-256-ofb',
     27   'aes-256-xts',
     28   'aes128',
     29   'aes192',
     30   'aes256',
     31   'bf',
     32   'bf-cbc',
     33   'bf-cfb',
     34   'bf-ecb',
     35   'bf-ofb',
     36   'blowfish',
     37   'camellia-128-cbc',
     38   'camellia-128-cfb',
     39   'camellia-128-cfb1',
     40   'camellia-128-cfb8',
     41   'camellia-128-ecb',
     42   'camellia-128-ofb',
     43   'camellia-192-cbc',
     44   'camellia-192-cfb',
     45   'camellia-192-cfb1',
     46   'camellia-192-cfb8',
     47   'camellia-192-ecb',
     48   'camellia-192-ofb',
     49   'camellia-256-cbc',
     50   'camellia-256-cfb',
     51   'camellia-256-cfb1',
     52   'camellia-256-cfb8',
     53   'camellia-256-ecb',
     54   'camellia-256-ofb',
     55   'camellia128',
     56   'camellia192',
     57   'camellia256',
     58   'cast',
     59   'cast-cbc',
     60   'cast5-cbc',
     61   'cast5-cfb',
     62   'cast5-ecb',
     63   'cast5-ofb',
     64   'des',
     65   'des-cbc',
     66   'des-cfb',
     67   'des-cfb1',
     68   'des-cfb8',
     69   'des-ecb',
     70   'des-ede',
     71   'des-ede-cbc',
     72   'des-ede-cfb',
     73   'des-ede-ofb',
     74   'des-ede3',
     75   'des-ede3-cbc',
     76   'des-ede3-cfb',
     77   'des-ede3-cfb1',
     78   'des-ede3-cfb8',
     79   'des-ede3-ofb',
     80   'des-ofb',
     81   'des3',
     82   'desx',
     83   'desx-cbc',
     84   'id-aes128-GCM',
     85   'id-aes192-GCM',
     86   'id-aes256-GCM',
     87   'idea',
     88   'idea-cbc',
     89   'idea-cfb',
     90   'idea-ecb',
     91   'idea-ofb',
     92   'rc2',
     93   'rc2-40-cbc',
     94   'rc2-64-cbc',
     95   'rc2-cbc',
     96   'rc2-cfb',
     97   'rc2-ecb',
     98   'rc2-ofb',
     99   'rc4',
    100   'rc4-40',
    101   'rc4-hmac-md5',
    102   'seed',
    103   'seed-cbc',
    104   'seed-cfb',
    105   'seed-ecb',
    106   'seed-ofb' ]
    View Code

     下面是我在项目中用到的对称加密算法:

    //在app.js中配置路由
    ...
    var jiami=require("./routes/jiami");
    ....
    app.use("/jiami",jiami);
    在service中请求node端路由:
    1
    $http.post("/app/jiami/encrypt",{str:JSON.stringify(user)}).success(function(miwen){ 2 // console.log("返回的密文:"+miwen); 3 }).error(function(error){ 4 return deferred.reject(error); 5 });
     1 var secret='pass';//密钥
     2 
     3 //加密
     4 router.post("/encrypt",function(req,res){
     5     var str=req.body.str;//明文
     6     var cipher = crypto.createCipher('aes192', secret);
     7     var enc = cipher.update(str, 'utf8', 'hex');//编码方式从utf-8转为hex;
     8     enc += cipher.final('hex');//编码方式从转为hex;
     9     res.send(enc);
    10 });
    11 //解密
    12 router.post("/decrypt",function(req,res){
    13     var str=req.body.str;//明文
    14     var decipher = crypto.createDecipher('aes192', secret);
    15     var dec = decipher.update(str, 'hex', 'utf8');//编码方式从hex转为utf-8;
    16     dec += decipher.final('utf8');//编码方式从utf-8;
    17     res.send(dec);
    18 });
    jiami.js

     3.2、非对称加密:这种方法还没用到,待后面继续补充。

     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    C# 使用微软的Visual Studio International Pack 类库提取汉字拼音首字母
    .net简单录音和播放音频文件代码
    一个简单的小例子让你明白c#中的委托-终于懂了!
    你是高级程序员?那就来挑战一下!
    .NET中的三种Timer的区别和用法
    C#中判断空字符串的3种方法性能分析
    解决statusStrip控件上的项目不能靠右对齐的问题
    C#的WebBrowser操作frame如此简单
    Python学习---Python安装与基础1205
    Java学习---IKAnalyzer中文分词器V2012_FF使用手册
  • 原文地址:https://www.cnblogs.com/laogai/p/4664917.html
Copyright © 2020-2023  润新知