JavaScript 安全的《加/解密处理》的实战--案例(二)

2023-12-14 00:25:21

前言:

在Web开发中,安全性一直是一个重要而复杂的议题,尤其是与敏感数据操作有关时。数据传输地过程中需要保证信息绝对的安全性,包括了诸如用户名、密码、个人信息等,这就需要对这类信息进行加密与解密。本案例(二)将带领大家实践运用JavaScript进行基本的解密流程。

对标2023年12月6日<有道翻译>的数据加密(片段)
图例:


解密数据函数:AES-128-CBC 解密案例

案例场景基于Node.js环境,我们会使用到Crypto模块提供的能力,构造一个灵活的解密函数 R。此函数负责对按照AES-128-CBC加密标准加密的数据进行解密。


?

// 定义基于AES-128-CBC算法的解密函数R
const R = (t, o, n) => {
    // 参数t代表Base64编码的加密字符串;o是密钥;n是初始化向量
    if (!t) return null; // 存在性检查,如果t不存在,返回null

    const e = require('crypto'), // Node.js的crypto模块
          y = someFormatterFunction; // 假设存在一个处理密钥和IV的函数

    // 构建固定长度的密钥和初始化向量IV
    const a = e.alloc(16, y(o)),
          i = e.alloc(16, y(n)); 

    // 创建AES解密实例
    const r = e.createDecipheriv("aes-128-cbc", a, i); 

    // 解密过程
    let s = r.update(t, "base64", "utf-8"); // Base64解码,之后以utf-8格式的文本输出
    s += r.final("utf-8"); // 追加解密完成后的最后输出内容

    return s; // 返回解密后的数据
};

详解(转个格式看-->原文转function):

function f (t,o,n){
                if (!t)
                    return null;
                const a = e.alloc(16, y(o))
                  , i = e.alloc(16, y(n))
                  , r = c.a.createDecipheriv("aes-128-cbc", a, i);
                let s = r.update(t, "base64", "utf-8");
                return s += r.final("utf-8"),
                s
            }  

解析:

  1. if (!t) return null;:如果输入 t(被假设是含有加密内容的变量)不存在,则函数返回 null;这可能是一种错误处理或条件检测,以避免空值导致进一步的运算错误。
  2. const a = e.alloc(16, y(o)), i = e.alloc(16, y(n));:声明了两个常量 a 和 i,都调用了 e.alloc(16, y(o)),e 可能是代表 Buffer 对象(在Node.js中用于处理二进制流),e.alloc 方法用于创建一个特定大小的buffer,此处是16字节,初始化填充为函数y对o和n返回值的结果,这里 o 很可能代表密钥,n 代表初始化向量(IV),这是AES加密所需的组件,而 y() 函数的作用可能是格式化或处理这些参数。
  3. const r = c.a.createDecipheriv("aes-128-cbc", a, i);:创建了一个解密器 r,c.a 似乎是指向某个加密库中的 createDecipheriv 方法。此方法用于初始化一个AES-128-CBC算法的解密流程,其中a 和 i 分别是处理过的密钥和初始化向量。
  4. let s = r.update(t, "base64", "utf-8");:开始解密过程,其中 r.update 负责处理加密数据 t, t 的格式是 "base64", 指定输出结果为 "utf-8" 格式的字符串,将解密结果分配给变量 s。
  5. return s += r.final("utf-8");:完成解密过程,r.final() 用来处理最后的加密块并返回剩余的解密内容,这里也是 "utf-8" 格式,然后将其结果附加到 s 上。最后,完整的解密字符串 s 被返回

在上述示例中,R 函数展示如何结合Node.js的底层加密库来解开数据的密文,并将其转变为可读格式:

存在性验证:保证合法数据的输入,防止无效操作。
资源调用:利用Node.js内建的crypto模块进行密钥和IV的处理,提供加密需求。
解密过程:通过update及final方法处理加密字符串,并以合适编码输出文本。
总结:
遇上AES-128-CBC加密代码的时候:
  1. 分析加密参数:识别加密过程中使用的关键参数,例如密钥(Key)、初始化向量(IV)、密码文本等。
  2. 理解加密过程:弄清楚加密是如何进行的,尤其是加密模式(CBC)和填充方案(例如PKCS7)。
  3. 提取密钥和IV:拦截或找到静态代码中硬编码或动态生成的密钥和IV。
  4. 构建解密过程:使用相同的算法参数(密钥、IV)书写对应的解密代码。
  5. 关注错误处理:理解代码如何应对解密时出现的错误或异常情况。
  6. 注意数据编码方式:值得注意的输入或输出可能采用Base64、十六进制等编码方式,需要适当转换。

文章来源:https://blog.csdn.net/m0_56758840/article/details/134820778
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。