【发布时间】:2021-12-27 01:09:40
【问题描述】:
我正在尝试为我们网站的 AMP 脚本计算 AMP 脚本哈希,因此我们不必在每次脚本中的某些内容发生更改时手动更新它们。我们不使用 node.js,或者我会简单地使用 amp-script 文档页面 (https://amp.dev/documentation/components/amp-script/) 上的给定解决方案。我已经尝试按照文档页面上列出的算法的步骤进行操作,但我无法让哈希值与元链接实际需要的哈希值相匹配。到目前为止,这是我的代码...
// Compute sha384 sum of script contents
var sha384 = SHA384.Create();
var hashBytes = sha384.ComputeHash(Encoding.UTF8.GetBytes(model.ScriptContents));
// Express hash sum as hexadecimal
var hashHex = BitConverter.ToString(hashBytes);
// Base64url-encode the result
var base64 = Convert.ToBase64String(Encoding.ASCII.GetBytes(hashHex)).TrimEnd('=').Replace('+', '-').Replace('/', '_');
// Prefix with 'sha384-'
var hash = "sha384-" + base64;
【问题讨论】:
-
您实际上并不打算返回
Base64-of-Base16-of-hash;只是Base64-of-hash。我认为关于“这个和应该用十六进制表示”的部分。让你失望:该页面是使用toolbox-script-csp为 JS 开发人员编写的,并且 JS 库都有自己处理二进制数据的特殊方式,而在 .NET 中我们可以使用Byte[]就好了。 -
重要提示:不要使用
String来表示您将要散列和服务的 JS 脚本文件:a 的散列由于在解码和重新编码过程中元信息丢失,字符串通常与原始文件不同,即使脚本的文本内容相同。例如,非规范化的 Unicode 字节在解码时被规范化,缺少前导字节顺序标记(Encoding.UTF8默认呈现,顺便说一句!),甚至从\n到\r\n的换行符转换(反之亦然) -versa) 取决于您的环境是如何设置的。 -
@Dai 感谢您的回复!关于以十六进制表示的总和的那部分在这里让我感到困惑......但是仅执行 Base64-of-hash(Byte[])也不会给出正确的结果。
-
另外,您需要处理您的
sha384实例(使用using()块,或使用.NET Core 中引入的新static HashData方法)。 -
我建议您在我的回答中尝试该方法。输出应该是正确的以及匹配其他程序计算的哈希值(例如 7Zip 的资源管理器菜单以显示哈希值)。您如何确定输出是否正确?如果我的回答不起作用,那么我怀疑您做错了其他事情 - 如果是这样,那么您需要发布更多上下文(以及代码和示例脚本文件),以便我们可以尝试重现该问题。
标签: c# encoding hash amp-html ampscript