NodeJS加密算法

本文将通过crypto的api深入了解加密算法

安全加密

当发送方A向接收方B发送数据时,需要考虑的问题有:

1.数据的安全性。2.数据的完整性,即数据不被篡改。3.数据的真实性,即数据确实来自于发送方,传输过程中没有被替换。4.数据的不可否认性,即验证发送方确实发送了数据。保证安全性

对称密钥加密 Symmetric Encryption

对称密钥加密又叫专用密钥加密或共享密钥加密,即发送和接收数据的双方必使用相同的密钥对明文进行加密和解密运算。

流程

1.A 使用密钥加密数据2.A 将密文发送给 B3.B 收到密文后,使用相同的密钥对其进行解密,取得原始数据优点:速度快

缺点:密钥被盗就被破解、密钥管理不方便(每个用户都要对应一个密钥)

实现算法有:凯撒密码,AES(Advanced Encryption Standard)、DES(Data Encryption Standard)、动态口令等。

推荐:AES

AES加解密特点

分组长度是128bit,也就是16字节。

1.加密第一步,针对每个分组逐个字节的进行SubBytes的操作。笼统的说,就是每个字节根据256个值的替换表,将当前字节替换成另外一个字节。2.加密第二步,以单个字节为单位进行ShiftRows处理,就是将字节有规律的打乱。3.加密第三部,再以4字节为单位进行MixColumns处理,就是进行比特运算变成另外的4个字节。4.加密第四步,还是4字节为单位与轮密钥进行XOR运算。至此一轮运算就结束了。解密的过程就是加密的逆向过程。

分组密码的模式

对称密钥算法DES、AES都属于分组密码,分组密码的特点是分组的长度是固定的。但是由于明文的长度不固定且基本超过分组长度,所以就需要进行多轮的迭代加密。 模式就是指的多轮迭代的方式。

  • ECB模式:Electronic CodeBook mode(电子密码本模式)* CBC模式:Cipher Block Chaining mode(密码分组链接模式)推荐使用* CFB模式:Cipher FeedBack mode(密文反馈模式)* OFB模式:Output FeedBack mode(输出反馈模式)* CTR模式:CounTeR mode(计数器模式)推荐使用### NodeJS示例:Cipher、Decipher
// 加密
const crypto = require("crypto");

const algorithm = "aes-192-cbc";
const password = "Password used to generate key";
// Use the async `crypto.scrypt()` instead.
const key = crypto.scryptSync(password, "salt", 24);
// Use `crypto.randomBytes` to generate a random iv instead of the static iv
// shown here.
const iv = Buffer.alloc(16, 0); // Initialization vector.

const cipher = crypto.createCipheriv(algorithm, key, iv);

let encrypted = cipher.update("some clear text data", "utf8", "hex");
encrypted += cipher.final("hex");
console.log(encrypted);
// Prints: e5f79c5915c02171eec6b212d5520d44480993d7d622a7c4c2da32f6efda0ffa 
// 解密
const crypto = require("crypto");

const algorithm = "aes-192-cbc";
const password = "Password used to generate key";
// Use the async `crypto.scrypt()` instead.
const key = crypto.scryptSync(password, "salt", 24);
// The IV is usually passed along with the ciphertext.
const iv = Buffer.alloc(16, 0); // Initialization vector.

const decipher = crypto.createDecipheriv(algorithm, key, iv);

// Encrypted using same algorithm, key and iv.
const encrypted ="e5f79c5915c02171eec6b212d5520d44480993d7d622a7c4c2da32f6efda0ffa";
let decrypted = decipher.update(encrypted, "hex", "utf8");
decrypted += decipher.final("utf8");
console.log(decrypted);
// Prints: some clear text data 

openssl list -cipher-algorithms 可以列出支持的加密算法

Cipher 类的创建

创建 Cipher 类可以使用crypto模块的 crypto.createCipher()crypto.createCipheriv() 方法。OpenSSL推荐使用 pbkdf2 来替换 EVP_BytesToKey ,因此在创建 Cipher 类时,建议使用 crypto.pbkdf2 来派生 keyiv ,并使用 createCipheriv() 来创建加密流。

  • crypto.createCipher(algorithm, password) :用给定的算法和密钥,创建并返回一个 Cipher 加密算法的对象。参数: algorithm 算法是依赖OpenSSL库支持的算法, 例如: 'aes192' 算法等, password 是用来派生 keyiv 的,它必须是一个 'binary' 二进制格式的字符串或者是一个 Buffer 。* crypto.createCipheriv(algorithm, key, iv) :用给定的算法、密钥和向量,创建并返回一个 Cipher 加密算法的对象。参数: algorithmcreateCipher 方法相同, key 密钥是一个被算法使用的原始密钥, iv 是一个
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值