You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在NodeJS中实现与PHP get_file_contents一致的加密文件读取功能

问题原因

加密文件属于非文本类的二进制数据,本身不符合UTF-8编码规则。你调用fs.readFile/fs.readFileSync时指定utf8编码的情况下,Node.js会强制将原始二进制字节按照UTF-8规则解码为字符串,遇到不符合UTF-8规则的字节会自动替换为�占位字符,直接篡改原始内容,导致和PHP读取结果校验不一致。PHP的file_get_contents默认返回原始二进制字符串,不会做额外编码转换,因此不会破坏加密内容。

解决方案

  1. 读取文件时不要指定任何编码参数,此时方法会直接返回Buffer对象,内容和PHP读取到的原始二进制数据完全一致,直接用该Buffer做校验、解密操作即可:
// 同步读取示例
const encryptedData = fs.readFileSync('加密文件路径');
// 异步读取示例
fs.readFile('加密文件路径', (err, encryptedData) => {
  // 此处直接使用encryptedData(Buffer类型)处理
})
  1. 如果你需要将二进制内容转为字符串和PHP逻辑对齐,可以选择base64或latin1编码转换,禁止使用utf8:
// 转base64字符串,与PHP base64_encode(file_get_contents($file))结果一致
const base64Str = encryptedData.toString('base64');
// 转单字节原始字符串,与PHP默认返回的字符串格式一致
const rawStr = encryptedData.toString('latin1');

常见踩坑说明

你之前尝试指定binary编码无效的原因是:Node.js中binary是latin1的别名,指定该编码后方法会返回字符串而非原始Buffer。如果你的校验逻辑是直接对原始字节计算哈希,直接传入字符串会导致校验结果不匹配,直接使用Buffer计算即可对齐PHP端结果:

// 示例:MD5校验和PHP的md5_file($file)结果完全一致
const crypto = require('crypto');
const fileHash = crypto.createHash('md5').update(encryptedData).digest('hex');

内容的提问来源于stack exchange,提问作者SudoGaron

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 08:06:03