求适用于Power Query的HMAC SHA256实现方案(含Base64转换)
求适用于Power Query的HMAC SHA256实现方案(含Base64转换)
我完全懂你现在的困扰——找到了SHA512的HMAC示例改出了Hex结果,但卡在Hex转Base64这一步,折腾JavaScript又没搞定对吧?别慌,我给你一套纯Power Query原生实现的方案,不用依赖任何外部脚本,直接用PQ支持的.NET类就能搞定,完美匹配你的需求!
第一步:实现HMAC SHA256生成Hex哈希
先定义一个生成HMAC SHA256 Hex结果的函数,直接调用.NET的加密类:
// 定义HMAC SHA256生成Hex哈希的函数 let HMAC_SHA256_Hex = (secret as text, payload as text) as text => let // 将密钥和载荷转换为UTF-8编码的字节数组 secretBytes = Text.ToBinary(secret, TextEncoding.Utf8), payloadBytes = Text.ToBinary(payload, TextEncoding.Utf8), // 初始化HMAC SHA256实例并计算哈希 hmacProvider = System.Security.Cryptography.HMACSHA256(secretBytes), hashBytes = hmacProvider.ComputeHash(payloadBytes), // 将哈希字节数组转换为Hex字符串 hexHash = Binary.ToText(hashBytes, BinaryEncoding.Hex) in hexHash in HMAC_SHA256_Hex
第二步:实现Hex转Base64的函数
接下来写一个把Hex字符串转成Base64的函数,核心是先把Hex转二进制,再转Base64:
// 定义Hex字符串转Base64的函数 let Hex_To_Base64 = (hexString as text) as text => let // 将Hex字符串解析为二进制数据 binaryData = Binary.FromText(hexString, BinaryEncoding.Hex), // 将二进制数据转换为Base64字符串 base64String = Binary.ToText(binaryData, BinaryEncoding.Base64) in base64String in Hex_To_Base64
第三步:测试你的示例数据
把两个函数结合起来,用你提供的测试数据验证一下:
// 测试示例代码 let // 你的密钥和载荷数据 secretKey = "37d9ba90-2abf-4399-8dcc-e66fefed36d1", payloadText = "09-05-2014|11:40:05.126|8700", // 生成Hex哈希结果 hexResult = HMAC_SHA256_Hex(secretKey, payloadText), // 转换为Base64结果 base64Result = Hex_To_Base64(hexResult) in base64Result
运行这段代码后,你会得到预期的结果:iYGCj1kMae0fprWxSyEXGz0Wl8PUKxjPtMmt9vZyC84=,和你给出的示例完全一致!
为什么不用JavaScript?
其实Power Query本身基于.NET框架,直接调用.NET的加密API比折腾外部JS脚本更稳定,也不需要额外的环境配置,而且代码可读性和可维护性都更高。之前你尝试JS没成功很正常,毕竟PQ里嵌入JS会有一些环境限制,用原生方法显然更靠谱。
备注:内容来源于stack exchange,提问作者daantheboss
相关产品推荐
相关产品推荐

