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

如何在Google Apps Script中实现RSA SHA_512签名(附PHP原代码)

在Google Apps Script中复现PHP的RSA-SHA512签名逻辑

问题背景

现有一段PHP代码,核心逻辑是对拼接后的data+token计算SHA512指纹,再用RSA私钥对指纹做SHA512withRSA签名,最后验证签名并返回指纹和Base64编码的签名。需要在Google Apps Script(GAS)中复现该功能,GAS无内置直接的RSA-SHA512签名函数,但可通过Utilities工具类实现。

核心实现步骤

GAS中可通过Utilities.rsaSign和Utilities.rsaVerify实现RSA签名与验证,需注意格式转换与PHP逻辑对齐:

1. 计算SHA512指纹(对应PHP的hash("sha512", $data))

PHP返回的是小写十六进制字符串,GAS的computeDigest返回字节数组,需转换为对应格式:

function computeSHA512Hex(str) {
  const digest = Utilities.computeDigest(Utilities.DigestAlgorithm.SHA_512, str);
  return digest.map(byte => (byte & 0xFF).toString(16).padStart(2, '0')).join('');
}

2. 解析PEM格式密钥

GAS的rsaSign/rsaVerify需要字节数组格式的密钥,需先去掉PEM头部、尾部及换行符,再Base64解码:

// 解析私钥
function parsePrivateKey(pem) {
  return Utilities.base64Decode(pem.replace(/-----BEGIN PRIVATE KEY-----|-----END PRIVATE KEY-----|\n/g, ''));
}

// 解析公钥
function parsePublicKey(pem) {
  return Utilities.base64Decode(pem.replace(/-----BEGIN PUBLIC KEY-----|-----END PUBLIC KEY-----|\n/g, ''));
}

3. RSA-SHA512签名与验证

对应PHP的openssl_sign和openssl_verify,GAS使用Utilities.rsaSign和Utilities.rsaVerify实现:

// 生成签名
function rsaSignSHA512(dataStr, privateKeyBytes) {
  const dataBytes = Utilities.newBlob(dataStr).getBytes();
  const signatureBytes = Utilities.rsaSign(dataBytes, privateKeyBytes, Utilities.DigestAlgorithm.SHA_512);
  return Utilities.base64Encode(signatureBytes);
}

// 验证签名
function verifyRsaSHA512(dataStr, signatureBase64, publicKeyBytes) {
  const dataBytes = Utilities.newBlob(dataStr).getBytes();
  const signatureBytes = Utilities.base64Decode(signatureBase64);
  try {
    Utilities.rsaVerify(dataBytes, signatureBytes, publicKeyBytes, Utilities.DigestAlgorithm.SHA_512);
    return true;
  } catch (e) {
    return false;
  }
}

4. 完整复现函数

整合所有步骤,与PHP逻辑完全对齐:

function encryptData(data, token, privateKeyPem, publicKeyPem) {
  // 拼接data与token
  const combinedData = data + token;
  
  // 计算SHA512指纹
  const fingerprint = computeSHA512Hex(combinedData);
  
  // 解析密钥
  const privateKeyBytes = parsePrivateKey(privateKeyPem);
  const publicKeyBytes = parsePublicKey(publicKeyPem);
  
  // 生成签名
  const signatureBase64 = rsaSignSHA512(fingerprint, privateKeyBytes);
  
  // 验证签名(对应PHP的校验逻辑)
  if (!verifyRsaSHA512(fingerprint, signatureBase64, publicKeyBytes)) {
    return false;
  }
  
  return [fingerprint, signatureBase64];
}

注意事项

  • 密钥格式:GAS仅支持PKCS#8格式的PEM密钥,若使用传统RSA私钥(-----BEGIN RSA PRIVATE KEY-----),需通过OpenSSL转换为PKCS#8格式:
    openssl pkcs8 -topk8 -inform PEM -in rsa_private.key -outform PEM -nocrypt
    
  • 填充方式:Utilities.rsaSign默认使用PKCS#1 v1.5填充,与PHP的openssl_sign默认行为一致,无需额外配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 14:37:10