如何通过Firebase Cloud Function实现SHA-256/AES-256字符串加密
Firebase Cloud Function 加密实现指引
前置概念澄清
首先需要明确两类算法的本质差异,避免场景错配:
- SHA-256 是单向密码学哈希算法,不属于可逆加密范畴:处理后输出固定长度的哈希值,无法通过哈希值反向推导出原始字符串,仅适用于数据完整性校验、不可逆存储凭证类场景。
- AES-256 是标准对称加密算法:输出的密文可通过持有正确密钥的流程解密还原为原始字符串,属于真正意义上的可逆加密,适用于需要后续还原敏感内容的存储、传输场景。
SHA-256 哈希实现
Firebase Cloud Function 运行在 Node.js 环境,内置crypto模块,无需安装任何第三方依赖即可完成计算:
const functions = require("firebase-functions"); const crypto = require("crypto"); exports.myfunction = functions.https.onCall((data, context) => { const someString = "Hello World!"; // 计算SHA-256哈希,输出为十六进制格式字符串 const encryptedString = crypto.createHash("sha256") .update(someString, "utf8") .digest("hex"); return { result: encryptedString }; });
如果需要提升哈希的抗碰撞强度,可在update方法的输入中拼接预先存储的固定盐值,避免彩虹表破解。
AES-256 可逆加密实现
AES-256 加密流程需要满足几个硬性要求:密钥长度必须为32字节(对应256位长度)、每次加密生成独立的随机初始向量、推荐使用带完整性校验的aes-256-gcm加密模式,同样基于内置crypto模块实现即可:
const functions = require("firebase-functions"); const crypto = require("crypto"); // 从云函数环境变量读取配置好的32字节AES密钥,禁止硬编码在代码中 const AES_SECRET_KEY = Buffer.from(functions.config().aes.secret_key, "utf8"); exports.myfunction = functions.https.onCall((data, context) => { const someString = "Hello World!"; // 每次加密生成12字节随机初始向量(AES-GCM模式的最优推荐长度) const initVector = crypto.randomBytes(12); // 初始化加密实例 const cipher = crypto.createCipheriv("aes-256-gcm", AES_SECRET_KEY, initVector); // 逐段更新加密内容,输出base64格式密文 let ciphertext = cipher.update(someString, "utf8", "base64"); ciphertext += cipher.final("base64"); // 获取加密生成的认证标签,解密时需用于校验数据是否被篡改 const authTag = cipher.getAuthTag().toString("base64"); // 密文需同时携带初始向量和认证标签,否则无法正常解密 const encryptedString = { ciphertext: ciphertext, initVector: initVector.toString("base64"), authTag: authTag }; return encryptedString; });
实现注意事项
- AES 密钥严禁硬编码在云函数代码中,必须通过云函数的环境变量配置存储,避免代码仓库泄露导致密钥外泄。
- 可调用云函数的返回值必须可被JSON序列化,不要直接返回原始Buffer类型,统一转换为base64格式进行传输和存储。
- 如果业务场景需要还原原始字符串,绝对不能选择SHA-256实现,必须使用AES这类支持解密的对称加密算法。
内容的提问来源于stack exchange,提问作者mcd
相关产品推荐
相关产品推荐

