如何缩短 Google 云存储签名下载 URL?
How do I shorten Google Cloud Storage Signed download URLs?
我有一个 firebase
应用程序,我使用 Firebase Storage
上传图片。当我使用 firebase web sdk
上传时,我返回的 URL
s 是合理的:
https://firebasestorage.googleapis.com/v0/b/projectId.appspot.com/o/image.jpg?alt=media&token=51183d4a-551a-41e2-b620-14b44b8c86ed
但是,由于 Firebase
在他们的 node.js
SDK 中不支持 storage API
,我必须使用 Google Cloud Storage SDK
:
bucketRef.upload(localImagePath, options, (err, file, response) => {
file.getSignedUrl({
action: 'read',
expires: '03-17-2030'
}, (err, url) => {
console.log(url)
})
})
这个 returns 太长了:
https://storage.googleapis.com/projectId.appspot.com/image.jpg?Googl
eAccessId=firebase-adminsdk-xfe5z@projectId.iam.gserviceaccount.com&Expires=1899950400&Si
gnature=fyotCYAbiWGuBGjwL0YDpByqZsKTdrwd9%2F7bZ88Rw8zP53dyEvcrIer6paYdzb%2BlH7OmJSRfcSxaAj7ur
GhZw20a4k4b5InLufqrOhSuYAE6w5vM2Hp8vz1XgSXl9jOFym2wMPEn7RkVwjxnT3QJKSBa0vqnkXX0wQUF4CjvHjUxbS
Tc9jj0NeNYUNmHGlZlVcKf%2BgE00rG9gt3QyCGAMt55h3kltMbyT%2FvnAYh%2FwuvhbVhX%2FNSCjieYb13KjjmDTgt
l5NU5nWY9Cu0QBraAbn6GlsUUvj0hBB2Gi7OHnUNi218w3EPehy7YAy6RhTcnuhiZlFaLX3TSmBS%2BX%2F3%2BoA%3D%
3D
我将这些 URL 保存在 firebase 中,因此这会成为一种存储负担,因为我存储的图像数量开始接近 6-7 位数字范围。
有没有办法缩短这个?
简短的回答是否定的,你不能缩短它。长答案是你不想缩短它:签名是一个加密签名的散列,它封装了上面提供的信息(action
和 expires
)并让最终用户长时间执行该操作因为 URL 有效。
如果它更短,有人可能会猜测您的数据的 URL,或者可能通过已知的明文攻击来破坏它(以与给定的已知明文相同的方式散列它并查看匹配项)。
有关详细信息,请参阅 GCS Docs on Signed URLs。
仅供参考,如果您有多个网址,您可以压缩它们并节省大约一半:
len(one_url) == 617
len(zlib.compress(one_url)) == 494
len(my_12_urls_object) == 7836
len(zlib.compress(my_12_urls_object)) == 3583
如果它们都是同时签名的,您可能会节省更多,但是,我的都是在不同时间签名的,因此 URL 的共同点较少。
我的用例是我将包含照片缩略图列表的对象发送到搜索 api,该搜索 json 对象大小有上限。
我有一个 firebase
应用程序,我使用 Firebase Storage
上传图片。当我使用 firebase web sdk
上传时,我返回的 URL
s 是合理的:
https://firebasestorage.googleapis.com/v0/b/projectId.appspot.com/o/image.jpg?alt=media&token=51183d4a-551a-41e2-b620-14b44b8c86ed
但是,由于 Firebase
在他们的 node.js
SDK 中不支持 storage API
,我必须使用 Google Cloud Storage SDK
:
bucketRef.upload(localImagePath, options, (err, file, response) => {
file.getSignedUrl({
action: 'read',
expires: '03-17-2030'
}, (err, url) => {
console.log(url)
})
})
这个 returns 太长了:
https://storage.googleapis.com/projectId.appspot.com/image.jpg?Googl
eAccessId=firebase-adminsdk-xfe5z@projectId.iam.gserviceaccount.com&Expires=1899950400&Si
gnature=fyotCYAbiWGuBGjwL0YDpByqZsKTdrwd9%2F7bZ88Rw8zP53dyEvcrIer6paYdzb%2BlH7OmJSRfcSxaAj7ur
GhZw20a4k4b5InLufqrOhSuYAE6w5vM2Hp8vz1XgSXl9jOFym2wMPEn7RkVwjxnT3QJKSBa0vqnkXX0wQUF4CjvHjUxbS
Tc9jj0NeNYUNmHGlZlVcKf%2BgE00rG9gt3QyCGAMt55h3kltMbyT%2FvnAYh%2FwuvhbVhX%2FNSCjieYb13KjjmDTgt
l5NU5nWY9Cu0QBraAbn6GlsUUvj0hBB2Gi7OHnUNi218w3EPehy7YAy6RhTcnuhiZlFaLX3TSmBS%2BX%2F3%2BoA%3D%
3D
我将这些 URL 保存在 firebase 中,因此这会成为一种存储负担,因为我存储的图像数量开始接近 6-7 位数字范围。
有没有办法缩短这个?
简短的回答是否定的,你不能缩短它。长答案是你不想缩短它:签名是一个加密签名的散列,它封装了上面提供的信息(action
和 expires
)并让最终用户长时间执行该操作因为 URL 有效。
如果它更短,有人可能会猜测您的数据的 URL,或者可能通过已知的明文攻击来破坏它(以与给定的已知明文相同的方式散列它并查看匹配项)。
有关详细信息,请参阅 GCS Docs on Signed URLs。
仅供参考,如果您有多个网址,您可以压缩它们并节省大约一半:
len(one_url) == 617
len(zlib.compress(one_url)) == 494
len(my_12_urls_object) == 7836
len(zlib.compress(my_12_urls_object)) == 3583
如果它们都是同时签名的,您可能会节省更多,但是,我的都是在不同时间签名的,因此 URL 的共同点较少。
我的用例是我将包含照片缩略图列表的对象发送到搜索 api,该搜索 json 对象大小有上限。