Firebase Cloud Storage Rules Playground 中的无效散列

Invalid hashing in Firebase Cloud Storage Rules Playground

我正在规则操场上测试hashing

这个returns“CRexOpCRkV1UtjNvRZCVOczkUrNmGyHZhkGKJXiDswo=”,字符串“SECRET”的正确散列:

let expected = hashing.sha256("SECRET");

但是这个returns“SECRETpath/to/the/file.mp4”,参数本身而不是它的散列:

let expected = hashing.sha256("SECRET" + request.resource.name);

这是规则操场中的错误吗?
哈希函数可以用于动态值还是有意阻止?

奇怪的规则游乐场行为之前已经在这里提到过,这次是 Firestore 安全规则:Firestore rules hashing returns identity

尝试使用模拟器和部署的应用程序后,hashing.sha256 似乎不适用于任何环境中的动态数据。该行为是一致的,因此 我提交了一个功能请求 以将此功能添加到存储安全规则中。这很好,因为它允许将签名数据传递给每个文件的安全规则(例如:通过 Cloud Function 获得的上传授权)

截至目前,我想象的解决方法是将数据放入用户自定义令牌(或自定义声明)中,这样我就可以将签名数据传递给安全规则。这并不理想,因为我需要为每个文件上传 re-sign 使用自定义令牌。

这里是 Firebaser!

这里有一些问题。我认为混淆的主要来源是 hashing.sha256 function returns a rules.Bytes 类型。调试字节类型时,Firebase 控制台中的 Rules Playground 似乎错误地显示了字符串值,但这与生产中的行为无关。 例如,此规则将始终拒绝:

allow write: if hashing.sha256("SECRET" + request.resource.name) ==
    "SECRET" + request.resource.name;

要获得您正在寻找的行为,您需要使用 rules.Bytes 类型的转换函数之一。根据您的问题,您可能希望 toBase64() function, but toHexString() 也是一个选项。如果您在 Rules 中尝试这些功能,Playground 应该会开始正常运行,并且 Rules 也会在生产中按预期工作。 所以把它们放在一起,你会写:

let expected = hashing.sha256("SECRET" + request.resource.name).toBase64();

例如,下面列出的规则将允许您上传名为“foo/bar”的文件(因为 Gqot1HkcleDFQ5770UsfmKDKQxt_-Jp4DRkTNmXL9m4= 是“SECRETfoo/bar”的 Base64 SHA-256 哈希)

allow write: if hashing.sha256('SECRET' + request.resource.name).toBase64() ==
    "Gqot1HkcleDFQ5770UsfmKDKQxt_-Jp4DRkTNmXL9m4=";

我希望这有助于解决问题!我们将单独研究解决 Playground

中的错误调试输出