dxCommonUtils
1. 概述
此模块是 dejaOS 官方系统模块库的一部分,用于通用加密、编码和文件系统工具函数。它被设计为无状态、类似单例的工具库,提供按逻辑命名空间组织的工具集合。
它包含全面的工具功能:
- crypto: 哈希(MD5、HMAC-MD5)、对称加密(AES)和非对称加密(RSA)。
- fs: 文件系统操作,例如将文件转换为/从 Base64。
- codec: 数据编码和解码函数(Hex、Base64、UTF-8、Little Endian 等)。
- random: 生成加密安全的随机字节和简单随机字符串。
2. 文件
dxCommonUtils.jslibvbar-m-dxcommonutils.so
- 确保这 2 个文件包含在您项目根目录下的 dxmodules 子目录中。
3. 依赖项
- 无
4. 兼容设备
兼容所有运行 dejaOS v2.0+ 的设备。
5. 使用方法
基本用法
import dxCommonUtils from "./dxmodules/dxCommonUtils.js";
import log from "./dxmodules/dxLogger.js";
// 1. 使用 crypto 命名空间进行哈希
const md5Hash = dxCommonUtils.crypto.md5("hello world");
log.info("MD5 哈希:", md5Hash); // 预期: 5eb63bbbe01eeed093cb22bb8f5acdc3
// 2. 使用 codec 命名空间进行编码/解码
const hexString = dxCommonUtils.codec.strToUtf8Hex("你好");
log.info("UTF-8 转 Hex:", hexString); // 预期: e4bda0e5a5bd
const originalString = dxCommonUtils.codec.utf8HexToStr(hexString);
log.info("Hex 转 UTF-8:", originalString); // 预期: 你好
// 3. 使用 random 命名空间生成随机数据
const randomBytes = dxCommonUtils.random.getBytes(8);
log.info("8 个随机字节(hex):", randomBytes);
// 4. 使用 fs 命名空间进行文件操作
const text = "This is a test file.";
const base64Text = dxCommonUtils.codec.arrayBufferToBase64(
dxCommonUtils.codec.hexToArrayBuffer(dxCommonUtils.codec.strToUtf8Hex(text))
);
const filePath = "/tmp/test.txt";
dxCommonUtils.fs.base64ToFile(filePath, base64Text);
log.info(`写入到 ${filePath}`);
const readBase64 = dxCommonUtils.fs.fileToBase64(filePath);
log.info(`从 ${filePath} 读取: ${readBase64}`);
6. API 参考
Crypto 命名空间(dxCommonUtils.crypto)
crypto.md5(data)
计算输入数据的 MD5 哈希。
- 参数:
data(string | ArrayBuffer | Uint8Array): 要哈希的数据。如果提供字符串,将被视为 UTF-8。(必需)
- 返回值:
string- 十六进制格式的 MD5 哈希。
crypto.hmacMd5(data, key)
使用提供的密钥计算 HMAC-MD5 哈希。
- 参数:
data(string | ArrayBuffer | Uint8Array): 要哈希的数据。(必需)key(string | ArrayBuffer | Uint8Array): HMAC 的密钥。(必需)- 注意:如果提供字符串,将被视为 UTF-8。
- 返回值:
string- 十六进制格式的 HMAC-MD5 哈希。
crypto.hash(data, hashAlgorithm)
使用指定算法计算输入数据的哈希。
- 参数:
data(string | ArrayBuffer | Uint8Array): 要哈希的数据。如果提供字符串,将被视为 UTF-8。(必需)hashAlgorithm(string): 要使用的哈希算法(例如 'SHA-256'、'MD5'、'SHA1'、'SHA-384'、'SHA-512')。默认为 'SHA-256'。(可选)
- 返回值:
string- 十六进制格式的哈希值。
crypto.aes.encrypt(data, key, options)
使用 AES 加密数据。
- 参数:
data(string | ArrayBuffer | Uint8Array): 要加密的数据。如果是字符串,视为 UTF-8。(必需)key(string | ArrayBuffer | Uint8Array): 加密密钥。如果是字符串,必须是 Hex。(必需)options(object): 加密选项:{ mode: 'CBC', keySize: 256, iv: '...' }。(可选)
- 返回值:
string- Base64 编码的加密数据。
crypto.aes.decrypt(encryptedData, key, options)
解密 AES 加密的数据。
- 参数:
encryptedData(string): 要解密的 Base64 编码数据。(必需)key(string | ArrayBuffer | Uint8Array): 解密密钥。如果是字符串,必须是 Hex。(必需)options(object): 解密选项。(可选)
- 返回值:
string- 解密的数据作为 UTF-8 字符串。
crypto.aes.encryptWithRandomIV(data, key)
AES-256-CBC 加密的便利方法,自动生成安全的 16 字节 IV。
- 参数:
data(string): 要加密的 UTF-8 数据。(必需)key(string | ArrayBuffer | Uint8Array): 32 字节加密密钥。如果是字符串,必须是 Hex。(必需)
- 返回值:
object- 包含 Base64 加密数据和生成的 IV 作为十六进制字符串的对象{ encrypted: "...", iv: "..." }。
crypto.rsa.generateKeyPair(bits)
生成新的 RSA 密钥对。
- 参数:
bits(number): 密钥大小(位)。必须是1024、2048、4096之一。默认为2048。(可选)
- 返回值:
object- 包含 PEM 格式密钥的对象{ privateKey: "...", publicKey: "..." }。
crypto.rsa.encrypt(data, publicKey)
使用 RSA 公钥加密数据。
- 参数:
data(string | ArrayBuffer | Uint8Array): 要加密的数据。如果是字符串,视为 UTF-8。(必需)publicKey(string): PEM 格式的 RSA 公钥。(必需)
- 返回值:
string- Base64 编码的加密数据。
crypto.rsa.decrypt(encryptedData, privateKey)
使用私钥解密 RSA 加密的数据。
- 参数:
encryptedData(string): Base64 编码的加密数据。(必需)privateKey(string): PEM 格式的 RSA 私钥。(必需)
- 返回值:
ArrayBuffer|null- 解密的数据作为 ArrayBuffer。解密失败时返回 null。
crypto.rsa.sign(data, privateKey, hashAlgorithm)
使用 RSA 私钥为数据创建数字签名。这是 JWT (RS256/RS384/RS512) 等标准所需的核心函数。
- 参数:
data(string | ArrayBuffer | Uint8Array): 要签名的数据。如果是字符串,将被视为 UTF-8。(必需)privateKey(string): PEM 格式的 RSA 私钥。(必需)hashAlgorithm(string): 要使用的哈希算法(例如 'SHA-256'、'SHA-384'、'SHA-512')。默认为 'SHA-256'。(可选)
- 返回值:
string- Base64 编码的签名字符串。
crypto.rsa.verify(data, signature, publicKey, hashAlgorithm)
使用 RSA 公钥验证数字签名。这是 rsa.sign 的对应函数,用于验证 JWT 等签名。
- 参数:
data(string | ArrayBuffer | Uint8Array): 原始的未签名数据。(必需)signature(string | ArrayBuffer | Uint8Array): 要验证的签名。如果是字符串,必须是 Base64 编码。(必需)publicKey(string): PEM 格式的 RSA 公钥。(必需)hashAlgorithm(string): 签名时使用的哈希算法(例如 'SHA-256'、'SHA-384'、'SHA-512')。默认为 'SHA-256'。(可选)
- 返回值:
boolean- 如果签名有效则返回 true,否则返回 false。
crypto.parsePEM(pemString)
解析 PEM 格式的 X.509 证书并返回其详细信息。
- 参数:
pemString(string): PEM 格式的证书内容。(必需)
- 返回值:
object- 包含证书详细信息的对象:serialNumber(string): 证书序列号。issuer(string): 证书颁发者。subject(string): 证书主题。validFrom(string): 证书有效期开始日期。validTo(string): 证书有效期结束日期。publicKey(string): PEM 格式的公钥。
crypto.verifyCertificate(certPEM, caCertPEM)
验证证书是否由给定的证书颁发机构 (CA) 签名。
- 参数:
certPEM(string): 要验证的证书,PEM 格式。(必需)caCertPEM(string): CA 的证书,PEM 格式。(必需)
- 返回值:
boolean- 如果证书由 CA 签名则返回 true。 - 抛出:
Error- 如果由于解析错误或签名不匹配导致原生验证失败。
FS 命名空间(dxCommonUtils.fs)
fs.fileToBase64(filePath)
读取文件的全部内容并作为 Base64 编码字符串返回。
- 参数:
filePath(string): 文件的绝对路径。(必需)
- 返回值:
string- 文件的 Base64 编码内容。
fs.base64ToFile(filePath, base64String)
解码 Base64 字符串并将二进制数据写入文件。如果文件已存在,将覆盖它。
- 参数:
filePath(string): 要写入的文件的绝对路径。(必需)base64String(string): Base64 编码的数据。(必需)
- 返回值:
boolean- 成功时为true。
Random 命名空间(dxCommonUtils.random)
random.getBytes(length)
使用底层 OpenSSL 引擎生成加密安全的随机字节。
- 参数:
length(number): 要生成的字节数。(必需)
- 返回值:
string- 随机字节表示为十六进制字符串。
random.getStr(length, charset)
使用 Math.random() 从给定字符集生成非加密安全的随机字符串。
- 参数:
length(number): 要生成的字符串长度。(必需)charset(string): 要使用的字符集。默认为字母数字。(可选)
- 返回值:
string- 生成的随机字符串。
Codec 命名空间(dxCommonUtils.codec)
此命名空间包含用于在不同格式之间转换数据的各种函数。
Hex <-> 字节/字符串:
codec.hexToBytes(hexString): 将十六进制字符串转换为字节数字数组。codec.bytesToHex(byteArray): 将字节数字数组转换为十六进制字符串。codec.hexToStr(hexString): 将十 六进制字符串转换为单字节字符字符串(例如,ASCII)。codec.strToHex(string): 将单字节字符字符串转换为十六进制字符串。codec.strToUtf8Hex(string): 将任何字符串(包括多字节字符)转换为 UTF-8 十六进制字符串。codec.utf8HexToStr(hexString): 将 UTF-8 十六进制字符串转换回字符串。
Hex <-> ArrayBuffer/Uint8Array:
codec.hexToArrayBuffer(hexString): 将十六进制字符串转换为ArrayBuffer。codec.hexToUint8Array(hexString): 将十六进制字符串转换为Uint8Array。codec.arrayBufferToHex(arrayBuffer): 将ArrayBuffer转换为十六进制字符串。codec.uint8ArrayToHex(uint8Array): 将Uint8Array转换为十六进制字符串。
Base64 <-> ArrayBuffer:
codec.base64ToArrayBuffer(base64String): 将 Base64 字符串解码为ArrayBuffer。codec.arrayBufferToBase64(arrayBuffer): 将ArrayBuffer编码为 Base64 字符串。
Little Endian <-> 十进制:
codec.leToDecimal(hexString): 将小端十六进制字符串转换为十进制数字。codec.decimalToLeHex(decimalNumber, byteSize): 将十进制数字转换为指定字节大小的小端十六进制字符串。
BCC
codec.bcc(data): 计算输入数据的 BCC(块校验字符/XOR 校验和)。- 返回值: 计算的 8 位 BCC 值(0-255)。