我正在尝试找出将应用上传到Google Play的拜占庭流程.
我正在使用Phonegap的Applaud系统来生成我的应用程序,为了让我创建一个"发布版本",我需要生成一个"Keystore".
但是,当我查看谷歌自己的发布清单时,没有关于"密钥库"的内容.
我在Stack Overflow上找到了这个答案,用于生成一个"Keystore",理论上它应该适用于Ubuntu,这就是我正在使用的:
keytool –genkey –v –keystore just2try.keystore –alias someKindOfName –keyalg RSA –validity 10000
Run Code Online (Sandbox Code Playgroud)
首先,我究竟应该把它放在哪里someKindOfName?我的应用程序的名称?
在任何情况下,当我运行它时,我得到这个回应:
keytool error: java.lang.RuntimeException: Usage error, –genkey is not a legal command
Run Code Online (Sandbox Code Playgroud)
我用谷歌搜索解决方案,但我发现的唯一的解决方案是Windows.
有人可以提供或指向一个稍微用户友好的分步指南来生成我应该拥有的这个"Keystore"的东西吗?一个有Ubuntu/Linux的工作命令?
我有一个现有的密钥库,其中包含密码和几个密码,其中包含我已导出并上传到Google Play的不同应用的不同密码.
现在我最近导入了一个应用程序的项目,对它进行了一些重大修改,我试图使用相同的密钥库导出它,并选择与我最初创建时相同的别名/密码.
问题是,在我选择密钥别名并输入密钥密码的步骤之后,我看到" 错误:无法恢复密钥 ".

我怀疑我可能输入了错误的密钥密码(请注意密钥库密码是正确的密码,因此这不是问题的原因).
我尝试创建新别名并在其下导出应用,但Google Play不会接受此文件,除非使用相同的证书进行签名.
除了试图暴力破解密钥密码外,我真的不知道如何继续这种情况.如果您认为这是唯一的路径,您是否知道密钥库中的密钥有一个很好的强力破解工具,我已经知道密码了?密钥库是一个.reg文件,使用Eclipse的Export向导创建.
在我们的应用程序中,我们一直遇到Android Keystore中的数据突然变得无法访问的问题.我们看到的具体例外情况如下:
java.security.UnrecoverableKeyException: Failed to obtain information about private key
at android.security.keystore.AndroidKeyStoreProvider.loadAndroidKeyStorePublicKeyFromKeystore(AndroidKeyStoreProvider.java:223)
at android.security.keystore.AndroidKeyStoreProvider.loadAndroidKeyStoreKeyPairFromKeystore(AndroidKeyStoreProvider.java:259)
at android.security.keystore.AndroidKeyStoreProvider.loadAndroidKeyStorePrivateKeyFromKeystore(AndroidKeyStoreProvider.java:269)
at android.security.keystore.AndroidKeyStoreSpi.engineGetKey(AndroidKeyStoreSpi.java:94)
at java.security.KeyStoreSpi.engineGetEntry(KeyStoreSpi.java:474)
at java.security.KeyStore.getEntry(KeyStore.java:1560)
at <PACKAGE_NAME>.EncryptionInteractor.generateKeys(EncryptionInteractor.java:104)
at <PACKAGE_NAME>.EncryptionInteractor.generateKeys(EncryptionInteractor.java:100)
at <PACKAGE_NAME>.EncryptionInteractor.init(EncryptionInteractor.java:93)
at <PACKAGE_NAME>.EncryptionInteractor.<init>(EncryptionInteractor.java:80)
at <PACKAGE_NAME>.EncryptionInteractor.init(EncryptionInteractor.java:65)
at <PACKAGE_NAME>.<APPLICATION_CLASS>.onCreate(APPLICATION_CLASS.java:17)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1118)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5791)
at android.app.ActivityThread.-wrap1(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1661)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Caused by: android.security.KeyStoreException: Invalid key blob
at android.security.KeyStore.getKeyStoreException(KeyStore.java:695)
at android.security.keystore.AndroidKeyStoreProvider.loadAndroidKeyStorePublicKeyFromKeystore(AndroidKeyStoreProvider.java:224)
... 21 more
Run Code Online (Sandbox Code Playgroud)
我们无法想出一种可靠的方法来重现这个问题.有几篇文章提到了可能导致密钥库"忘记"密钥或被锁定的状态,例如此处.但是,据我所知,我们没有陷入任何这些边缘情况.在首次设置密钥后让设备静置一段时间后,似乎会发生这种情况.我们已经看到这种情况发生在多个仿真器和设备上,范围从21到26.此外,这些设备使用了滑动解锁或PIN.更改PIN或安全方法似乎不会导致此问题.同样,这个问题似乎是在设备未使用几天之后发生的.
android android-keystore java-security private-key android-security
我将更新我在Google PlayStore上提供的客户端应用.我只有一个带密码的.p12文件,而不是.keystore文件.
我想知道是否可以将更新后的版本发布到Google PlayStore.
对不起基本问题.我很困惑.提前感谢您的协助.
我正在尝试使用Cipher带有RSA密钥对的a "AndroidKeyStore".在我能找到的所有Android文档中,示例显示Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding")或Cipher.getInstance("RSA/ECB/PKCS1Padding").两者都在Android Studio上提出相同的警告:
不应使用ECB加密
Cipher#getInstance不应该使用ECB作为密码模式调用,或者不设置密码模式,因为android上的默认模式是ECB,这是不安全的.
显然我不能省略它,或者将模式设置为None,因为默认是ECB.如果ECB模式不安全,我应该使用哪种模式?
如果我使用任何其他模式(我知道),我会得到一个NoSuchAlgorithmException: No provider found for RSA/{mode}/OAEPWithSHA-256AndMGF1Padding.填充可能是问题吗?
无论哪种方式,根据Android KeyStore系统文档,ECB模式似乎是它在使用RSA时支持的唯一密码块模式.
我的应用仅收到来自 Android 10 用户的单一崩溃报告。这是堆栈跟踪:
Fatal Exception: java.lang.NullPointerException: Attempt to read from field 'int android.security.keymaster.ExportResult.resultCode' on a null object reference
at android.security.keystore.AndroidKeyStoreProvider.loadAndroidKeyStorePublicKeyFromKeystore(AndroidKeyStoreProvider.java:256)
at android.security.keystore.AndroidKeyStoreProvider.loadAndroidKeyStoreKeyPairFromKeystore(AndroidKeyStoreProvider.java:296)
at android.security.keystore.AndroidKeyStoreProvider.loadAndroidKeyStorePrivateKeyFromKeystore(AndroidKeyStoreProvider.java:316)
at android.security.keystore.AndroidKeyStoreProvider.loadAndroidKeyStoreKeyFromKeystore(AndroidKeyStoreProvider.java:378)
at android.security.keystore.AndroidKeyStoreSpi.engineGetKey(AndroidKeyStoreSpi.java:105)
at java.security.KeyStore.getKey(KeyStore.java:1062)
at we.lmk.iqQ(we.lmk:19)
at we.Vmk.apply(we.Vmk:51)
at io.reactivex.internal.operators.single.SingleMap$MapSingleObserver.onSuccess(SingleMap.java:57)
at io.reactivex.internal.operators.single.SingleFromCallable.subscribeActual(SingleFromCallable.java:56)
at io.reactivex.Single.subscribe(Single.java:3603)
at io.reactivex.internal.operators.single.SingleMap.subscribeActual(SingleMap.java:34)
at io.reactivex.Single.subscribe(Single.java:3603)
at io.reactivex.internal.operators.single.SingleZipArray.subscribeActual(SingleZipArray.java:63)
at io.reactivex.Single.subscribe(Single.java:3603)
at io.reactivex.internal.operators.maybe.MaybeFilterSingle.subscribeActual(MaybeFilterSingle.java:40)
at io.reactivex.Maybe.subscribe(Maybe.java:4290)
at io.reactivex.internal.operators.maybe.MaybeMap.subscribeActual(MaybeMap.java:40)
at io.reactivex.Maybe.subscribe(Maybe.java:4290)
at io.reactivex.internal.operators.maybe.MaybeMap.subscribeActual(MaybeMap.java:40)
at io.reactivex.Maybe.subscribe(Maybe.java:4290)
at io.reactivex.internal.operators.maybe.MaybeFlatMapSingle.subscribeActual(MaybeFlatMapSingle.java:47)
at io.reactivex.Single.subscribe(Single.java:3603)
at io.reactivex.internal.operators.single.SingleFlatMap.subscribeActual(SingleFlatMap.java:36)
at io.reactivex.Single.subscribe(Single.java:3603)
at io.reactivex.internal.operators.single.SingleFlatMap.subscribeActual(SingleFlatMap.java:36)
at io.reactivex.Single.subscribe(Single.java:3603)
at io.reactivex.internal.operators.single.SingleSubscribeOn$SubscribeOnObserver.run(SingleSubscribeOn.java:89)
at io.reactivex.Scheduler$DisposeTask.run(Scheduler.java:578)
at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:66)
at …Run Code Online (Sandbox Code Playgroud) 我们目前正在尝试使用生物识别技术对数据进行签名,我们使用 androidx.biometric 库。
问题是,如果没有安装指纹但注册了人脸,我们将无法生成任何密钥。
仅使用指纹或结合指纹和面部,一切都完美无缺。
仅注册了人脸,我们在密钥生成过程中会遇到以下异常:
引起:java.security.InvalidAlgorithmParameterException:java.lang.IllegalStateException:必须至少注册一个生物特征才能创建每次使用都需要用户身份验证的密钥
在我们开始生成密钥之前,我们测试生物识别的存在如下:
boolean isAvailable = biometricManager.canAuthenticate() == BiometricManager.BIOMETRIC_SUCCESS;
作为搭载 Android 10 的三星 Galaxy S10 的测试设备。
感谢您的帮助和最好的问候
android biometrics android-keystore keystore-access android-biometric-prompt
keytool -genkey -v -keystore my-release-key.keystore -alias alias_name \
-keyalg RSA -keysize 2048 -validity 10000
Run Code Online (Sandbox Code Playgroud)
虽然10000天似乎是永恒的,但27年可能比你想象的要快,并且RSA可能仍在使用中.
如果调整命令行参数现在有0.01%的机会在未来节省我的市场份额,我愿意这样做.
问题:如何尽可能长时间地建立这个有效期?
我了解使用相同的密钥(数据共享等)签署所有Android应用程序的好处 - 以及Google推荐的这一事实.
我的想法是,使用不同的密钥签署每个应用程序(至少每个与其他应用程序无关且不太可能需要共享数据的应用程序)可能有一个重要原因.这是因为如果您最终希望或需要将代码交给其他开发人员或公司以便将来更新.
在这种情况下 - 例如,如果您销售应用程序可能会出现这种情况 - 您需要提供您的应用程序签名的密钥,以便新所有者使用他们所做的任何改进来更新Play商店.
现在,如果您使用相同的密钥对所有应用程序进行了签名,则无法在不影响所有其他应用程序的情况下为这个应用程序的新用户提供密钥,或者在新软件包/证书下重新发布所有应用程序随之而来的问题.如果您使用自己的密钥签署所有不相关的应用程序,您可以发送此应用程序的一个密钥,而不必担心.
所以问题是 - 是这样的吗?还是我误解了一些基本的东西?
作为第二个问题,如果我的上述想法是正确的,您是否可以使用相同的密钥库,并为您的不同应用程序的所有密钥设置不同的别名?根据我的理解,别名是实际的密钥对,但是你可以将它们"拉出"密钥库以将它们发送给新的开发人员,如上面概述的那样吗?或者,计划此应急计划的人是否应该为每个应用程序使用新的密钥库?
非常感谢你!
Android 6.0+有一个KeyInfo类来获取保存在密钥中的密钥的信息AndroidKeyStore.在KeyInfo课堂上,我们拥有isInsideSecureHardware()和isUserAuthenticationRequirementEnforcedBySecureHardware()方法.我们也有isUserAuthenticationRequired().该文件,像往常一样,很烂.
基于方法名和(有限)的文件,它会看起来好像isUserAuthenticationRequirementEnforcedBySecureHardware()是一个简单的逻辑和
isInsideSecureHardware()和isUserAuthenticationRequired().
还有什么比这更重要的吗?如果是这样,除了安全硬件中的密钥之外,安全硬件强制执行用户身份验证要求意味着什么?
android ×10
android-keystore ×10
keystore ×3
rsa ×2
apk ×1
biometrics ×1
code-signing ×1
encryption ×1
export ×1
google-play ×1
java ×1
keytool ×1
private-key ×1