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
中的错误调试输出
我正在规则操场上测试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
中的错误调试输出