Articles of android keystore

使用KeyPairGeneratorSpec获取Android API级别<18?

我想将秘密数据存储在我的应用程序的私有密钥库中。 但是,当我正在编写代码来执行此操作时,Android Studio警告KeyPairGeneratorSpec.Builder(context)需要API级别18,并且我将目标定位为14。 🙁 如何在Android API级别14到17的应用程序中存储秘密数据?

使用软件/硬件支持的Android Keystore以及可能的安全性/可用性缺陷

我目前正在研究在Android应用程序中存储/使用机密密钥的可能性。 我发现Nikolay Elenkov的博客对这个主题很有帮助,我学到了很多关于Android密钥库和一些基于硬件的实现的东西。 我仍然对安全性和用户体验方面有一些疑问。 软件密钥库 根据我的理解,在此配置中,从用户密码(加上盐以防止彩虹表攻击)导出(使用PBKDF2)主密钥,并用于加密机密。 据我所知,密码是用于锁定屏幕的密码。 在非root用户手机上,只有用户’keystore’能够读/写加密文件,每当应用程序想要访问文件时,都必须调用keystore守护进程,该守护进程检查其UID是否有权访问该文件(授权存储在sqlite数据库中)。 但仍有一些我无法弄清楚的细节: 使用密钥库是否强制使用受密码保护的锁定屏幕? 每次需要访问加密密钥时,用户是否必须输入他/她的密码? 鉴于它是一种纯软件机制,我认为只要密钥操作用于加密操作,密钥总是会在RAM中解密,对吧? 基于硬件的密钥库 至于基于硬件的实现,SoC制造商似乎提供符合[Global Platform TEE][2] (可信执行环境)的解决方案,其中包含嵌入式可信应用程序和API,使Google能够提供其密钥库的硬件支持实现。 因此,可以在TEE中存储密钥,在TEE内部请求创建RSA密钥对,并使用存储在TEE内的密钥来签名或检查数据。 这样,人们就可以使用密钥进行基本的加密操作,而无需离开TEE。 如果我做对了,那么Google密钥库守护程序使用与软件实现中相同的机制来提供对这些密钥的访问控制。 唯一的区别是使用了对存储在TEE中的密钥的引用而不是加密密钥本身。 如果之前说明的所有内容都是正确的,我想在root用户手机上可以修改权限数据库,以便具有任意UID的应用程序可以使用存储在TEE中的任何密钥签名数据。 我对吗 ? 谢谢你的时间!

使用不同的密钥库/别名签署不同的Android应用程序可能带来的好处

第一个问题 我了解使用相同的密钥(数据共享等)签署所有Android应用程序的好处 – 以及Google推荐的这一事实。 我的想法是,使用不同的密钥签署每个应用程序(至少每个与其他应用程序无关且不太可能需要共享数据的应用程序)可能有一个重要原因。 这是因为如果您最终希望或需要将代码交给其他开发人员或公司以便将来更新。 在这种情况下 – 例如,如果您销售应用程序可能会出现这种情况 – 您需要提供您的应用程序签名的密钥,以便新所有者使用他们所做的任何改进来更新Play商店。 现在,如果您使用相同的密钥对所有应用程序进行了签名,则无法在不影响所有其他应用程序的情况下为这一个应用程序的新所有者提供密钥,或者在新软件包/证书下重新发布所有应用程序随之而来的问题。 如果您使用自己的密钥签署所有不相关的应用程序,您可以发送此应用程序的一个密钥,无需担心。 所以问题是 – 这是这样的吗? 还是我误解了一些基本的东西? 第二个问题 作为第二个问题,如果我的上述想法是正确的,您是否可以使用相同的密钥库,并为您的不同应用程序的所有密钥设置不同的别名? 根据我的理解,别名是实际的密钥对,但是你可以将它们“拉出”密钥库以将它们发送给新的开发人员,如上面概述的那样吗? 或者,是否有人计划此应急计划为每个应用程序使用新的密钥库? 非常感谢你!

不应使用ECB模式的密码

我正在尝试使用带有RSA密钥对的Cipher和”AndroidKeyStore” 。 在我能find的所有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时支持的唯一密码块模式。

使用.p12签名

我将更新我在Google PlayStore上提供的客户端应用。 我只有一个带密码的.p12文件,而不是.keystore文件。 我想知道是否可以将更新后的版本发布到Google PlayStore。 对不起基本问题。 我很困惑。 提前感谢您的帮助。

触摸三星手机上的指纹后出错:android.security.KeyStoreException:未经过身份validation的密钥用户

我的应用程序使用Android 6.0 Fingerprint API来保护Android KeyStore中的AES密钥。 只有在用户通过指纹传感器进行身份validation时才能使用存储的密钥,因为KeyGenParameterSpec是使用setUserAuthenticationRequired(true)初始化的。 当用户触摸传感器时,我从onAuthenticationSucceeded(Cipher)的回调中获得初始化的密码,并将其用于解密。 除了使用Android 6的三星手机外,这种方法效果很好。当我尝试使用返回的密码时,三星手机有时会抛出android.security.KeyStoreException: Key user not authenticated 。 因此,即使密码由onAuthenticationSucceeded(Cipher)返回,Android KeyStore也认为用户未被指纹传感器validation。 似乎崩溃发生在应用程序长时间不使用时。 当应用程序崩溃时,通常都能正常工作。 由于这个错误是随机发生的,只在三星手机上发生……这似乎是由Android 6.0 KeyStore和FingerPrint API的三星实现中的一些内部时序问题引起的。 编辑 :在OnePlus和Acer手机中也遇到过这个问题。

Android Keystore系统如何安全?

我在http://developer.android.com/training/articles/keystore.html上阅读了Android文档但是我遗漏了一些细节…… 如果应用程序使用AndroidKeyStore生成密钥(对称或非对称)。 我们可以从该密钥库中提取密钥吗? 另一个应用程序(AppB)可以访问AppA生成的密钥吗? 在哪种情况下,我们可能会松开钥匙? 设备出厂仅重置? 谢谢。

如何为Google Play生成“密钥库”?

我正在尝试找出将应用上传到Google Play的拜占庭流程。 我正在使用Phonegap的Applaud系统来生成我的应用程序,为了让我创建一个“发布版本”,我需要生成一个“Keystore”。 但是,当我查看Google自己的发布清单时 ,没有关于“密钥库”的内容。 我在Stack Overflow上find了这个答案来生成一个“Keystore”,理论上它应该适用于Ubuntu,这就是我正在使用的: keytool –genkey –v –keystore just2try.keystore –alias someKindOfName –keyalg RSA –validity 10000 首先,我应该把它放在哪里说someKindOfName ? 我的应用程序的名称? 在任何情况下,当我运行它时,我得到这个回应: keytool error: java.lang.RuntimeException: Usage error, –genkey is not a legal command 我用Google搜索了解决方案,但我发现的唯一解决方案是Windows。 有人可以提供或指向一个稍微用户友好的分步指南来生成我应该拥有的这个“Keystore”的东西吗? 一个有Ubuntu / Linux的工作命令?

我的应用中的Google地图不可见

当我启动我的应用程序时,我收到以下错误: V/GoogleSignatureVerifier(4962): com.myapp.application signature not valid. Found: V/GoogleSignatureVerifier(4962): MIIDDTCCAfWgAwIBAgIEO0I8qTANBgkqhkiG9w0BAQsFADA3MQswCQYDVQQGEwJVUzEQMA4GA1UE V/GoogleSignatureVerifier(4962): ChMHQW5kcm9pZDEWMBQGA1UEAxMNQW5kcm9pZCBEZWJ1ZzAeFw0xNTA0MjEyMDM4NDRaFw00NTA0 V/GoogleSignatureVerifier(4962): MTMyMDM4NDRaMDcxCzAJBgNVBAYTAlVTMRAwDgYDVQQKEwdBbmRyb2lkMRYwFAYDVQQDEw1BbmRy V/GoogleSignatureVerifier(4962): b2lkIERlYnVnMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAn/4shkSGhYP1pwMY4bFc V/GoogleSignatureVerifier(4962): dKuMg6JyTdUON6XF8VxifADMYd/WwgzsETT+AHZXlo6RwQFhtwbxrvmuhBOMip2ivhmRGT8JpBcI V/GoogleSignatureVerifier(4962): FqjCOxLzw3B3psZhnioZwCBTKBrCau8/q0XW40lXa/OCy2wA4EZs2ThaqwqgdGwpKXN+qHNHAFAS V/GoogleSignatureVerifier(4962): 0g/SdupsSID+WctlL2XdCo50Jq/bJJAWQBz1SL03xBWUikuiWKM6mz/6Up8oE4WtZhU7V83R7FYM V/GoogleSignatureVerifier(4962): XmRU4CghlvczG+ujCrZwSsYttsZgz2nb4NY2w9fvevAXgSB/N6JfOatnccW5vmukkm6g12iysA9u V/GoogleSignatureVerifier(4962): hS3EjVb01bKyMdoXhQIDAQABoyEwHzAdBgNVHQ4EFgQUByeU0uE1tXyrL0UimKkJH2CbeXIwDQYJ V/GoogleSignatureVerifier(4962): KoZIhvcNAQELBQADggEBABPPel3zEbk6/ZzwfvIS0z8IqvYgzxzxSZFEAp+PrlEEyk+IVHQgQAVS V/GoogleSignatureVerifier(4962): I6JM9rNkxR2hvQHP3V9pd2d5bYhsCBZFSn6drOmnBrnABXH8e4OdqN9fRcKn+acfbZ+yBvZoVbr/ V/GoogleSignatureVerifier(4962): IhRvRrpLDtDNnD4kUoLfTgw/Xygdiq5/aU5WSfXdrUx6Va0vg6uJZY6Yq4J4a/R+/T7lLwzQgerq V/GoogleSignatureVerifier(4962): eNUvY9HbcmegJDKMGeyc4Po8akAt9gDRo4nswuP0Sve8oSMqBEfO8ItTsIPx3UVEXuYUeC8e8nwb V/GoogleSignatureVerifier(4962): fyhDXSFAo59Y1+NWcZNsGdum95YV8oZloF7+4fFqBwz7w0mb+M+JfY1sg7I= 我已经读过debug.keystore默认密钥只有1年的有效期,所以必须先删除它才能让android studio生成一个新的。 最终我做到了,但错误仍然存​​在。 此举后,我的应用程序中的Google地图不再可见… 如果可以的话请帮忙。

使用现有密钥库导出已签名的Android应用程序时出现“错误:无法恢复密钥”

我有一个现有的密钥库,其中包含密码和几个密码,其中包含我已导出并上传到Google Play的不同应用的不同密码。 现在我最近导入了应用程序的一个项目,对它进行了一些重大修改,我试图使用相同的密钥库导出它,并选择与我最初创建时相同的别名/密码。 问题是,在我选择密钥别名并输入密钥密码的步骤后,我看到“ ERROR:无法恢复密钥 ”。 我怀疑我可能输入了错误的密钥密码(请注意密钥库密码是正确的密码,因此这不是问题的原因)。 我尝试创建新别名并在其下导出应用,但Google Play不会接受此文件,除非使用相同的证书进行签名。 除了试图暴力破解密钥密码外,我真的不知道如何继续这种情况。 如果您认为这是唯一的路径,您是否知道密钥库中的密钥有一个很好的powershell破解工具,我已经知道密码了? 密钥库是一个.reg文件,使用Eclipse的Export向导创建。