Создание дайджеста SHA512 в кодировке base64 для файла (или набора файлов) - PullRequest
1 голос
/ 24 февраля 2011

Инструмент сборки BlackBerry WebWorks SDK для планшетных ПК создает архив, содержащий файлы и файл MANIFEST.MF с записью для каждого файла и дайджестом SHA512 в кодировке base64. Тем не менее, есть ошибка, что слишком много файлов в сборке приведет к сбою сборки. Я пытаюсь выяснить, как генерировать эту же информацию самостоятельно.

Пример ниже взят из 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. Я нашел эту комбинацию команд openssl и tr, но она кажется чем-то вроде клуджа.

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

Есть ли лучший способ создать этот дайджест?

В конце концов, мне придется сделать все изображения в дереве каталогов. Я надеялся на решение сценария вместо того, чтобы писать программу. Второй вопрос - как создать этот синтаксис манифеста для всех файлов в каталоге (рекурсивно). Будет ли это сценарий оболочки bash, включающий приведенную выше команду? Любые указатели здесь приветствуются, так как я раньше не писал сценарий оболочки.

Ответы [ 2 ]

1 голос
/ 24 февраля 2011

Решение Денниса Уильямсона помогло мне, но установленная версия 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

Мне все еще нужно настроить имя, чтобы в нем не было префикса ./, но это на другой день.

1 голос
/ 24 февраля 2011

Вы можете сократить свою команду, комбинируя некоторые вещи:

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
...