现在我要获得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 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
两个结果不匹配。
cmd.exe:uQzK / Tk81BxWs8sBwQyvTLOWCKQ =
Power Shell:Pz8 / Pwo / MDNuPyE / Pys / Pz8 / Sm8K
为什么?发生了什么?
这是PowerShell中对象管道的结果,您永远不应该在PowerShell中管理原始二进制数据,因为它会被破坏。
在PowerShell中管理原始二进制数据永远不安全。 PowerShell中的管道用于可以安全地自动转换为字符串数组的对象和文本。请阅读this以获取详细信息的完整说明。
使用powershell计算的结果是错误的,因为您使用了管道。解决此问题的一种方法是在powershell中使用cmd.exe:
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