为文件(或文件集)生成base64编码的SHA512摘要

时间:2011-02-24 02:44:56

标签: bash openssl base64 sha512 blackberry-playbook

BlackBerry WebWorks SDK for Tablet OS构建工具生成一个包含文件的存档和一个MANIFEST.MF,其中包含每个文件的条目和base64编码的SHA512摘要。但是,有一个错误,即构建中的太多文件将导致构建失败。我想弄清楚如何自己生成相同的信息。

以下示例来自MANIFEST.MF,它包含文件名和摘要。但是,base64变体使用_代替/-而不是+,并且没有用于填充的尾随==

Archive-Asset-Name: air/XX/IMG_0999.jpg
Archive-Asset-SHA-512-Digest: YI_KXWjpJwwsi5MDQPeBQc9SVi-bH6zYq5PgBD3jQiqHu-r-5Hv8A0yh_y5j2T9MpYZ5TVMW4JXHSXNYmpV1tA

我运行Windows 7,但安装了GIT,所以我将MINGW32作为bash shell。我找到了openssl和tr命令的这种管道组合,但它似乎有点像kludge。

openssl dgst -sha512 -binary IMG_0999.gif | openssl enc -base64 | tr '+' '-' | tr '/' '_' | tr -d '=' | tr -d '\n'

是否有更好的方法来生成此摘要?

最终,我将不得不为目录树中的所有图像做。我希望有一个脚本解决方案而不必编写程序。第二个问题是如何为目录中的所有文件生成清单语法(递归)。这是一个包含上述命令的bash shell脚本吗?这里的任何指针都很受欢迎,因为我之前没有编写过shell脚本。

2 个答案:

答案 0 :(得分:1)

您可以通过组合一些内容来缩短命令:

openssl dgst -sha512 -binary IMG_0999.gif | openssl enc -base64 | tr '+/' '-_' | tr -d '=\n'

对于树中的所有文件,例如:

find . -type f -name '*.gif' -print0 | xargs -0 -I % sh -c 'openssl dgst -sha512 -binary "$(basename "$1")" | openssl enc -base64 | tr "+/" "-_" | tr -d "=\n" > "$1.sum"' _ $1

答案 1 :(得分:1)

Dennis Williamson的解决方案让我开始,但安装的tr版本(2.0)就像多字符语法一样。此外,xargs版本(4.1)不喜欢-I选项。然而,它让我开始,这是重要的。以下是我最终的结果:

find . -type f -name '*.gif' -print0 | xargs -0 --replace=% sh -c 'echo -e "Archive-Asset-Name: %\nArchive-Asset-SHA-512-Digest: `openssl dgst -sha512 -binary % | openssl enc -base64 | tr "+" "-" | tr "/" "_" | tr -d "=" | tr -d "\n"`\n"'

并生成以下内容(更改图像名称以保护无辜者)

Archive-Asset-Name: ./IMG_0001.gif
Archive-Asset-SHA-512-Digest: AsgQnXYxj07qy-DTlzqYEv3v1UNqbr1sp5kVz0PE8FYwD-q_0VM20Wyci3xunJwdqy59MbyIX1GGtSmhuETUHQ

Archive-Asset-Name: ./IMG_0032.gif
Archive-Asset-SHA-512-Digest: JE3lmvXxOjSpDoUjyvAp92E1T4b8AQGGJBCcBz_1AG2eoBoSRH76LHpWPEUAeXFx_kOqEaDMRGPrpYnlfcnz9g

Archive-Asset-Name: ./IMG_0003.gif
Archive-Asset-SHA-512-Digest: bJJQ-j-s9630FzUh3hP50h7gWYqJQ6o0FP37nUuSeSUmerFxBwR2X0VeTYn-h4cf7szUr4fqDfAKQLOK0gt7zA

我仍然需要调整名称,使其不以./为前缀,但这是另一天。