通过HTML画布和Javascript代码从被劫持的PNG图像中提取数据
字数 972 2025-08-27 12:33:37

通过HTML画布和JavaScript从PNG图像中提取隐藏数据

技术概述

本文介绍了一种利用HTML5 Canvas和JavaScript从PNG图像中提取隐藏数据的技术。该技术是数据隐藏和提取的完整解决方案的一部分,特别适用于在图像中嵌入和提取结构化数据(如JSON)。

技术背景

在之前的文章中,作者描述了如何将任意文本数据(特别是JSON)存储为PNG图像中的像素。这种方法利用了图像像素的RGB通道来存储数据,而Alpha通道保持固定值(255,完全不透明)。

数据提取流程

1. 加载图像

首先需要创建一个Image对象并设置其src属性为包含隐藏数据的PNG图像:

var img = new Image();
img.onload = function() {
    // 解码代码将放在这里
};
img.src = 'image.png'; // 可以是文件路径、URL或数据URL

2. 创建画布并绘制图像

为了访问像素数据,需要将图像渲染到屏外画布上:

var imgSize = img.width; // 假设图像是正方形的
var canvas = document.createElement('canvas');
canvas.width = canvas.height = imgSize;
var ctx = canvas.getContext('2d');
ctx.drawImage(img, 0, 0);

3. 读取数据大小

图像的第一个像素(0,0)的红色通道存储了数据方块的大小:

var headerData = ctx.getImageData(0, 0, 1, 1);
var dataSize = headerData.data[0]; // 第一个字节(红色通道)表示数据大小

4. 提取像素数据

从图像中提取实际数据区域(从第二行开始,跳过第一行):

var imageData = ctx.getImageData(0, 1, dataSize, dataSize);
var paddedData = imageData.data; // 获取像素数据(RGBA格式)

5. 转换像素数据为字节数组

创建一个Uint8Array来存储RGB数据,忽略Alpha通道:

var uint8array = new Uint8Array(paddedData.length / 4 * 3);

var idx = 0;
for (var i = 0; i < paddedData.length - 1; i += 4) {
    var subArray = paddedData.subarray(i, i + 3); // 取RGB三个通道
    uint8array.set(subArray, idx);
    idx += 3;
}

6. 去除零填充数据

从数组末端开始遍历,找到第一个非零字节以确定实际数据长度:

var includeBytes = uint8array.length;
for (var i = uint8array.length - 1; i > 0; i--) {
    if (uint8array[i] == 0) {
        includeBytes--;
    } else {
        break;
    }
}

7. 解码原始数据

使用TextDecoder将字节数组转换为原始字符串:

var data = uint8array.subarray(0, includeBytes);
var strData = (new TextDecoder('utf-8')).decode(data);

如果原始数据是JSON,可以进一步解析:

var jsonData = JSON.parse(strData);

技术特点

  1. 数据容量:最大支持255×255像素的数据方块(约195KB原始数据)
  2. 数据组织
    • 第一行像素用于元数据
    • 第一个像素的红色通道存储数据方块大小
    • 剩余空间用于存储实际数据
  3. 编码效率:使用RGB三个通道存储数据,Alpha通道固定

改进建议

  1. 添加指纹验证:在第一行存储特殊像素序列作为解码指纹,防止误解码非数据图像
  2. 数据压缩:在编码前对数据进行压缩,提高存储效率
  3. 错误检测:添加校验和或哈希值验证数据完整性

实际应用

  1. 黑产利用:已有报道称黑产利用类似技术隐藏恶意代码
  2. 数据隐藏:可用于在图像中隐藏敏感信息
  3. 数字水印:可用于版权保护和身份验证

相关资源

  1. GitHub实现
  2. Canvas数据压缩
  3. JSZip编码

总结

这种技术提供了一种在PNG图像中隐藏和提取数据的有效方法,虽然编码效率不是最优,但实现简单且实用。通过Canvas API和JavaScript的配合,可以在浏览器环境中轻松实现数据的隐藏和提取。

通过HTML画布和JavaScript从PNG图像中提取隐藏数据 技术概述 本文介绍了一种利用HTML5 Canvas和JavaScript从PNG图像中提取隐藏数据的技术。该技术是数据隐藏和提取的完整解决方案的一部分,特别适用于在图像中嵌入和提取结构化数据(如JSON)。 技术背景 在之前的文章中,作者描述了如何将任意文本数据(特别是JSON)存储为PNG图像中的像素。这种方法利用了图像像素的RGB通道来存储数据,而Alpha通道保持固定值(255,完全不透明)。 数据提取流程 1. 加载图像 首先需要创建一个Image对象并设置其src属性为包含隐藏数据的PNG图像: 2. 创建画布并绘制图像 为了访问像素数据,需要将图像渲染到屏外画布上: 3. 读取数据大小 图像的第一个像素(0,0)的红色通道存储了数据方块的大小: 4. 提取像素数据 从图像中提取实际数据区域(从第二行开始,跳过第一行): 5. 转换像素数据为字节数组 创建一个Uint8Array来存储RGB数据,忽略Alpha通道: 6. 去除零填充数据 从数组末端开始遍历,找到第一个非零字节以确定实际数据长度: 7. 解码原始数据 使用TextDecoder将字节数组转换为原始字符串: 如果原始数据是JSON,可以进一步解析: 技术特点 数据容量 :最大支持255×255像素的数据方块(约195KB原始数据) 数据组织 : 第一行像素用于元数据 第一个像素的红色通道存储数据方块大小 剩余空间用于存储实际数据 编码效率 :使用RGB三个通道存储数据,Alpha通道固定 改进建议 添加指纹验证 :在第一行存储特殊像素序列作为解码指纹,防止误解码非数据图像 数据压缩 :在编码前对数据进行压缩,提高存储效率 错误检测 :添加校验和或哈希值验证数据完整性 实际应用 黑产利用 :已有报道称黑产利用类似技术隐藏恶意代码 数据隐藏 :可用于在图像中隐藏敏感信息 数字水印 :可用于版权保护和身份验证 相关资源 GitHub实现 Canvas数据压缩 JSZip编码 总结 这种技术提供了一种在PNG图像中隐藏和提取数据的有效方法,虽然编码效率不是最优,但实现简单且实用。通过Canvas API和JavaScript的配合,可以在浏览器环境中轻松实现数据的隐藏和提取。