Результат Openssl не соответствует cmd и Power shell windows

теперь я собираюсь получить подпись ключа отладки Android.

в команде windows (cmd.exe)

keytool -exportcert -alias androiddebugkey -keystore debug.keystore | openssl.exe sha1 -binary | openssl.exe base64
Enter keystore password:  android

Warning:
The JKS keystore uses a proprietary format. It is recommended to migrate to PKCS12 which is an industry standard format using "keytool -importkeystore -srckeystore debug.keystore -destkeystore debug.keystore -deststoretype pkcs12".
uQzK/Tk81BxWs8sBwQyvTLOWCKQ=

в Windows Power Shell

keytool -exportcert -alias androiddebugkey -keystore debug.keystore | .openssl.exe
sha1 -binary | .openssl.exe base64
Enter keystore password:  android

Warning:
The JKS keystore uses a proprietary format. It is recommended to migrate to PKCS12 which is an industry standard format using "keytool -importkeystore -srckeystore debug.keystore -destkeystore debug.keystore -deststoretype pkcs12".
Pz8/Pwo/MDNuPyE/Pys/Pz8/Sm8K

два результата не совпадали.

cmd.exe:uQzK/Tk81BxWs8sBwQyvTLOWCKQ=

Силовая Оболочка: Pz8 / Pwo/MDNuPyE/Pys/Pz8 / Sm8K

почему? Что случилось?

1 ответов


это следствие конвейера объектов в PowerShell, и вы никогда не должны передавать необработанные двоичные данные в PowerShell, потому что они будут повреждены.

никогда не безопасно передавать необработанные двоичные данные в PowerShell. Каналы в PowerShell предназначены для объектов и текста, которые можно безопасно автоматически преобразовать в массив строк. Пожалуйста, прочитайте этой для полного объяснения с подробностями.

результат, рассчитанный с помощью powershell, неверен, потому что вы использовали трубы. Один из способов исправить это-использовать cmd.exe из powershell:

cmd /C "keytool -exportcert -alias androiddebugkey -keystore debug.keystore | openssl.exe sha1 -binary | openssl.exe base64"

вместо использования каналов вы можете читать / записывать ввод / вывод из / в файлы. К сожалению, openssl.exe sha1 не имеет -in параметр для указания входного файла. Поэтому нам нужно использовать powershell-commandlet Start-Process, который позволяет читать и записывать файлы с параметрами -RedirectStandardInput и -RedirectStandardOutput:

keytool -exportcert -alias mykey -storepass wortwort -file f1.bin
Start-Process -FilePath openssl.exe -ArgumentList "sha1 -binary" -RedirectStandardInput f1.bin -RedirectStandardOutput f2.bin
Start-Process -FilePath openssl.exe -ArgumentList base64 -RedirectStandardInput f2.bin -RedirectStandardOutput o_with_ps.txt

keytool запись в файл f1.bin. Тогда openssl.exe sha1 читает f1.bin и пишет к f2.bin. Наконец,openssl.exe base64 читает f2.bin и o_with-ps.txt