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

BigQuery JavaScript自定义函数创建求助:语法错误排查

修正BigQuery临时JS UDF加密MSISDN的问题

核心错误与修复要点

  • 参数名非法:原函数用const作为参数名,const是JavaScript保留关键字,直接导致语法错误,需改为合法变量名(比如msisdn)。
  • 数据类型误用:MSISDN是带前导0的字符串,用FLOAT64会丢失前导0,参数和返回类型都应改为STRING。
  • 不支持Node.js模块:BigQuery JS UDF运行环境基于浏览器,无法使用Node.js的require('crypto'),需改用Web Crypto API实现加密逻辑。
  • IV长度不合法:AES-256-CBC要求IV必须是16字节,原IV仅3字节,需调整为16字节的有效值。
  • 未执行加密逻辑:原JS代码仅定义了encrypt函数但未调用,需在UDF中直接执行并返回结果。

修正后的完整代码

CREATE TEMPORARY FUNCTION encryption(msisdn STRING)
RETURNS STRING
LANGUAGE js AS """
async function encrypt(input) {
  // 加密配置,注意IV必须为16字节
  const encryptionConfig = {
    password: "abc",
    salt: "xyz123",
    iv: "abcdefghijklmnop", // 16字节长度的IV
    iterationCount: 783923,
    algorithm: "AES-CBC",
    keyLength: 256, // 对应AES-256加密
    keyShaAlg: "SHA-256"
  };

  // 基于PBKDF2生成加密密钥
  const encoder = new TextEncoder();
  const passwordBytes = encoder.encode(encryptionConfig.password);
  const saltBytes = encoder.encode(encryptionConfig.salt);
  
  const keyMaterial = await crypto.subtle.importKey(
    "raw",
    passwordBytes,
    { name: "PBKDF2" },
    false,
    ["deriveKey"]
  );

  const key = await crypto.subtle.deriveKey(
    {
      name: "PBKDF2",
      salt: saltBytes,
      iterations: encryptionConfig.iterationCount,
      hash: encryptionConfig.keyShaAlg
    },
    keyMaterial,
    { name: encryptionConfig.algorithm, length: encryptionConfig.keyLength },
    false,
    ["encrypt"]
  );

  // 转换IV为字节数组
  const ivBytes = encoder.encode(encryptionConfig.iv);

  // 执行加密
  const inputBytes = encoder.encode(input);
  const encryptedBuffer = await crypto.subtle.encrypt(
    { name: encryptionConfig.algorithm, iv: ivBytes },
    key,
    inputBytes
  );

  // 转换为Base64并URL编码
  const encryptedBase64 = btoa(String.fromCharCode(...new Uint8Array(encryptedBuffer)));
  return encodeURIComponent(encryptedBase64);
}

// 调用加密函数并返回结果
return encrypt(msisdn);
""";

WITH MSISDN AS (
  SELECT "0000000000" AS msisdn
)
SELECT encryption(msisdn)
FROM MSISDN;

补充说明

  • Web Crypto API为异步接口,因此加密函数需使用async/await,BigQuery会自动处理UDF的异步逻辑。
  • 若需解密MSISDN,可编写对应的解密UDF,复用相同配置并调用Web Crypto的decrypt方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 09:35:21