2017-10-28 11 views
6

Teraz otrzymam podpis klucza android debugowania.Wynik Openssl nie pasuje do cmd i powłoki Power of Window

W polecenia systemu 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= 

W Windows PowerShell

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 

Dwa wynik nie pasujące.

cmd.exe: uQzK/Tk81BxWs8sBwQyvTLOWCKQ =

Moc Shell: Pz8/Pwo/MDNuPyE/PYS/Pz8/Sm8K

Dlaczego? Co się stało?

Odpowiedz

4

Jest to konsekwencja potoku obiektowego w PowerShell i nie powinieneś używać surowych danych binarnych w PowerShell, ponieważ będzie on uszkodzony.

Nigdy nie jest bezpiecznie przetwarzać surowych danych binarnych w PowerShell. Rury w PowerShell są przeznaczone dla obiektów i tekstu, które można bezpiecznie automagicznie przekonwertować na tablicę ciągów. Proszę przeczytać this w celu uzyskania pełnych wyjaśnień ze szczegółami.

Wynik obliczony za pomocą polecenia powershell jest nieprawidłowy, ponieważ użyto potoków. Jednym ze sposobów, aby rozwiązać ten problem jest użycie cmd.exe od wewnątrz powershell:

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

Zamiast wykorzystujące rury można odczytać/zapisać wejścia/wyjścia z/do plików. Niestety, plik opensl.exe sha1 nie ma parametru -in do określenia pliku wejściowego. Dlatego musimy użyć PowerShell commandlet Start-Process, który umożliwia odczyt i zapis plików z parametrami -RedirectStandardInput i -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 zapisuje do pliku f1.bin. Następnie openssl.exe sha1 czyta od f1.bin i zapisuje do f2.bin. Wreszcie openssl.exe base64 odczytuje i zapisuje z f2.bin do o_with-ps.txt

+2

+1 Ten problem jest również omówione szerzej w [tej sprawie] (https://github.com/PowerShell/PowerShell/issues/1908) na repo PowerShell. –

Powiązane problemy