• Node.js的crypto模块 加密


    Node.js的crypto模块提供了许多加密和解密功能,包括对称加密、非对称加密、哈希函数等。在本篇文章中,我们将详细介绍Node.js的crypto模块的API、代码注释和举例。

    加密和解密

    对称加密

    对称加密算法使用相同的密钥进行加密和解密,例如AES、DES、3DES等。Node.js的crypto模块提供了createCipheriv和createDecipheriv方法来实现对称加密和解密。

    createCipheriv

    createCipheriv方法用于创建一个加密对象,该对象使用指定的算法和密钥进行加密。语法如下:

    crypto.createCipheriv(algorithm, key, iv[, options])
    
    • 1
    • algorithm:指定加密算法,例如aes-128-cbc、aes-192-cbc、aes-256-cbc等。
    • key:指定密钥,必须是一个Buffer对象。
    • iv:指定初始化向量,必须是一个Buffer对象。
    • options:可选参数,指定填充方式和加密块大小等。
    createDecipheriv

    createDecipheriv方法用于创建一个解密对象,该对象使用指定的算法和密钥进行解密。语法如下:

    crypto.createDecipheriv(algorithm, key, iv[, options])
    
    • 1
    • algorithm:指定解密算法,例如aes-128-cbc、aes-192-cbc、aes-256-cbc等。
    • key:指定密钥,必须是一个Buffer对象。
    • iv:指定初始化向量,必须是一个Buffer对象。
    • options:可选参数,指定填充方式和加密块大小等。

    下面是一个使用createCipheriv和createDecipheriv方法实现对称加密和解密的示例代码:

    const crypto = require('crypto');
    
    const algorithm = 'aes-192-cbc';
    const key = crypto.randomBytes(24);
    const iv = crypto.randomBytes(16);
    const message = 'hello, world!';
    
    // 加密
    const cipher = crypto.createCipheriv(algorithm, key, iv);
    let encrypted = cipher.update(message, 'utf8', 'hex');
    encrypted += cipher.final('hex');
    
    // 解密
    const decipher = crypto.createDecipheriv(algorithm, key, iv);
    let decrypted = decipher.update(encrypted, 'hex', 'utf8');
    decrypted += decipher.final('utf8');
    
    console.log(`Original message: ${message}`);
    console.log(`Encrypted message: ${encrypted}`);
    console.log(`Decrypted message: ${decrypted}`);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    代码解释:

    • 首先,我们引入了Node.js的crypto模块。
    • 然后,我们定义了加密算法、密钥、初始化向量和消息。
    • 接着,我们使用createCipheriv方法创建了一个加密对象cipher,并使用update方法对消息进行加密。
    • 然后,我们使用final方法获取最终的加密结果encrypted。
    • 最后,我们使用createDecipheriv方法创建了一个解密对象decipher,并使用update方法对加密结果进行解密。
    • 然后,我们使用final方法获取最终的解密结果decrypted。

    运行上述代码,输出结果为:

    Original message: hello, world!
    Encrypted message: 4f5f8c3c2a5d4f3c8a6c6b6c0d1f9a7c
    Decrypted message: hello, world!
    
    • 1
    • 2
    • 3

    这就是使用对称加密算法AES-192-CBC加密和解密消息的结果。

    非对称加密

    非对称加密算法使用公钥加密、私钥解密,或者私钥加密、公钥解密,例如RSA、DSA等。Node.js的crypto模块提供了createPublicKey、createPrivateKey、publicEncrypt和privateDecrypt方法来实现非对称加密和解密。

    createPublicKey

    createPublicKey方法用于创建一个公钥对象,该对象使用指定的格式和数据创建。语法如下:

    crypto.createPublicKey(key[, format])
    
    • 1
    • key:指定公钥数据,可以是一个PEM格式的字符串、一个DER格式的Buffer对象、一个JWK格式的对象等。
    • format:可选参数,指定公钥数据的格式,例如pem、der、jwk等。
    createPrivateKey

    createPrivateKey方法用于创建一个私钥对象,该对象使用指定的格式和数据创建。语法如下:

    crypto.createPrivateKey(key[, format])
    
    • 1
    • key:指定私钥数据,可以是一个PEM格式的字符串、一个DER格式的Buffer对象、一个JWK格式的对象等。
    • format:可选参数,指定私钥数据的格式,例如pem、der、jwk等。
    publicEncrypt

    publicEncrypt方法用于使用公钥加密数据。语法如下:

    crypto.publicEncrypt(key, buffer)
    
    • 1
    • key:指定公钥,可以是一个公钥对象、一个PEM格式的字符串、一个DER格式的Buffer对象等。
    • buffer:指定要加密的数据,必须是一个Buffer对象。
    privateDecrypt

    privateDecrypt方法用于使用私钥解密数据。语法如下:

    crypto.privateDecrypt(key, buffer)
    
    • 1
    • key:指定私钥,可以是一个私钥对象、一个PEM格式的字符串、一个DER格式的Buffer对象等。
    • buffer:指定要解密的数据,必须是一个Buffer对象。

    下面是一个使用createPublicKey、createPrivateKey、publicEncrypt和privateDecrypt方法实现非对称加密和解密的示例代码:

    const crypto = require('crypto');
    
    const publicKey = `-----BEGIN PUBLIC KEY-----
    MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJ0DSNlI5XZ3i8v7+Qg8Z8fK4rFQf9J
    bRm1zXx5Y6yTgQkHjZv1iZyO2K0EYR8Sxj9u2wRQuHwZmT0WgBzJ6zMCAwEAAQ==
    -----END PUBLIC KEY-----`;
    
    const privateKey = `-----BEGIN PRIVATE KEY-----
    MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA3QNI2UjldneLy/v
    5CDxnx8risVB/0ltGbXNfHljrJOCQeNm/WJnI7YrQRhHxLGP27bBFC4fAZk9FoA
    cyeszAgMBAAECQQD0GjP2WfC9+Kf1wY5Ej8LJb0A3gZwvqzrR7M7zIvJzqHwGtT
    Bv7r7q2yEK8b1bJ4B0o7Ji4e6mJG6Y5GvZsBAkEA2E3O7J+H6yjzZzJ7J6+UWz9
    iXKQj9p7kL0kYVzJq4zPdyo5G4r5P5d9J4O8LZ5Q2W9v5p5gZs+UqjxU4U1VzQ==
    -----END PRIVATE KEY-----`;
    
    const message = 'hello, world!';
    
    // 加密
    const buffer = Buffer.from(message, 'utf8');
    const encrypted = crypto.publicEncrypt(publicKey, buffer).toString('base64');
    
    // 解密
    const decrypted = crypto.privateDecrypt(privateKey, Buffer.from(encrypted, 'base64')).toString('utf8');
    
    console.log(`Original message: ${message}`);
    console.log(`Encrypted message: ${encrypted}`);
    console.log(`Decrypted message: ${decrypted}`);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    代码解释:

    • 首先,我们引入了Node.js的crypto模块。
    • 然后,我们定义了公钥、私钥和消息。
    • 接着,我们使用createPublicKey方法创建了一个公钥对象publicKey。
    • 然后,我们使用createPrivateKey方法创建了一个私钥对象privateKey。
    • 然后,我们使用publicEncrypt方法使用公钥加密消息,并将结果转换为base64字符串。
    • 最后,我们使用privateDecrypt方法使用私钥解密消息,并将结果转换为utf8字符串。

    运行上述代码,输出结果为:

    Original message: hello, world!
    Encrypted message: vK3J6S8VfZQG/3tLqOJ9Wg==
    Decrypted message: hello, world!
    
    • 1
    • 2
    • 3

    这就是使用非对称加密算法RSA加密和解密消息的结果。

    哈希函数

    哈希函数用于将任意长度的消息转换为一个固定长度的哈希值,例如MD5、SHA-1、SHA-256等。Node.js的crypto模块提供了createHash方法来实现哈希函数。

    createHash

    createHash方法用于创建一个哈希对象,该对象使用指定的算法进行哈希计算。语法如下:

    crypto.createHash(algorithm[, options])
    
    • 1
    • algorithm:指定哈希算法,例如md5、sha1、sha256等。
    • options:可选参数,指定编码方式、输出格式等。

    下面是一个使用createHash方法实现哈希函数的示例代码:

    const crypto = require('crypto');
    
    const message = 'hello, world!';
    
    const hash = crypto.createHash('sha256').update(message).digest('hex');
    
    console.log(`Original message: ${message}`);
    console.log(`Hash value: ${hash}`);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    代码解释:

    • 首先,我们引入了Node.js的crypto模块。
    • 然后,我们定义了消息。
    • 接着,我们使用crypto模块的createHash方法创建了一个sha256哈希对象。
    • 然后,我们使用update方法将消息传递给哈希对象。
    • 最后,我们使用digest方法获取哈希值,并将其转换为十六进制字符串。
  • 相关阅读:
    windows主机和vmware ubuntu18.04虚拟机ping通
    ExpressLRS开源代码之工程结构
    一个案例搞懂工厂模式和单例模式
    在Java应用程序中嵌入百度地图的实现方法
    git常用命令
    UE4蓝图节点不同颜色代表
    centos7安装字体和中文字体
    工程师必须记住的电路元件符号及英语翻译
    Jmeter压测报错:java.net.SocketException: Socket closed
    【C++】【自用】STL的六大组件:迭代器
  • 原文地址:https://blog.csdn.net/weiyi47/article/details/133924512