返回

程序员练就神仙般的base64调试术

前端

base64调试之旅

这两天做了一个需求,读取上传的公私钥,然后利用私钥采用RSA加密摘要,发送给后端。其中运用到了base64的加解密,RSA加密采用的是node的Crypto模块,base64的转码采用的是js-base64,然而万万没有想到,这里面有坑啊。

文件读取

首先是文件的读取,采用的是FileReader进行读取。由于安全策略,直接使用FileReader读取本地文件是不允许的。必须将文件先拖入浏览器。

const fileInput = document.querySelector("input[type=file]");
fileInput.addEventListener("change", (e) => {
  const file = e.target.files[0];
  const reader = new FileReader();
  reader.onload = () => {
    // 文件读取成功后的处理
    const fileContent = reader.result;
    // ...
  };
  reader.readAsText(file);
});

需要注意的是,FileReader在不同的浏览器中兼容性不同。在某些浏览器中,可能需要使用FileReaderSync来同步读取文件。

base64转码

接下来是base64的转码。使用js-base64库进行转码时,需要注意以下几点:

  • js-base64库的版本要与node的版本一致。
  • 在使用js-base64库进行转码时,需要先将文件转换成ArrayBuffer。
  • 在使用js-base64库进行转码时,需要指定输出格式。默认情况下,js-base64库会输出一个字符串。如果需要输出一个ArrayBuffer,则需要指定outputType为"arraybuffer"。
const fileContent = await readFileSync(filePath);
const arrayBuffer = new Uint8Array(fileContent).buffer;
const base64String = Base64.encode(arrayBuffer, { outputType: "string" });

RSA加密

最后是RSA加密。使用node的Crypto模块进行RSA加密时,需要注意以下几点:

  • 在使用Crypto模块进行RSA加密之前,需要先将私钥转换成PEM格式。
  • 在使用Crypto模块进行RSA加密时,需要指定加密算法和填充方式。
  • 在使用Crypto模块进行RSA加密时,需要将明文转换成Buffer。
const privateKey = readFileSync(privateKeyPath);
const privateKeyPem = privateKey.toString("utf8");
const encryptedData = crypto.privateEncrypt(
  {
    key: privateKeyPem,
    oaepHash: "sha256",
    padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,
  },
  Buffer.from(message)
);

总结

在开发过程中,遇到问题不要慌张,要多思考,逐步调试。同时,也要注意不同库的兼容性和使用注意事项。