Java ';密钥用户未经身份验证';,理解Android密钥库
我正试图在Android应用程序中安全地存储一个秘密。为此,我想使用Android密钥库中的密钥对它们进行加密,类似于在iOS上使用密钥链。我跟随了,只需要考虑Android 6 +< /p> 据我所知,密钥库是由Android提供的安全存储。但是,我并不真正理解是谁解锁了对密钥库的访问。我目前所做的是使用以下方法创建密钥:Java ';密钥用户未经身份验证';,理解Android密钥库,java,android,security,keystore,Java,Android,Security,Keystore,我正试图在Android应用程序中安全地存储一个秘密。为此,我想使用Android密钥库中的密钥对它们进行加密,类似于在iOS上使用密钥链。我跟随了,只需要考虑Android 6 +< /p> 据我所知,密钥库是由Android提供的安全存储。但是,我并不真正理解是谁解锁了对密钥库的访问。我目前所做的是使用以下方法创建密钥: private SecretKey generateKey(String keyAlias) { try { KeyGenerator keyGen
private SecretKey generateKey(String keyAlias) {
try {
KeyGenerator keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES);
keyGenerator.init(new KeyGenParameterSpec.Builder(keyAlias, KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
.setBlockModes(KeyProperties.BLOCK_MODE_CBC)
.setUserAuthenticationRequired(true)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)
.build());
return keyGenerator.generateKey();
} catch (NoSuchAlgorithmException | InvalidAlgorithmParameterException e) {
// handling...
}
}
现在,使用android.security.KeyStoreException:key user not authenticated
加密时,使用此密钥失败。我看到设置setUserAuthenticationRequired(true)
需要身份验证,但是,我不知道如何提供此身份验证。我假设只要用户解锁了他的手机,就可以访问密钥库。我了解到需要指纹传感器来验证用户的密钥库,但是,许多Android设备还没有指纹传感器。如果指定“AndroidKeyStore”
作为提供程序,那么如果设备支持,则将使用安全的硬件支持密钥库。这在实践中意味着,即使是你自己的应用程序,也不可能提取私钥材料
其他应用程序也不可能/很难使用您创建的密钥。但我不太熟悉这是如何实施的
您可以使用的getOrigin
和isInsideSecureHardware
方法检查您创建的密钥是否由/存储在安全硬件中
*显然,这取决于设备的安全硬件模块是否得到很好的实现,并且没有可利用的漏洞。过去发现过一些实际的漏洞利用,尽管它们需要物理访问设备IIRC。关键是没有什么是100%安全的
现在,在使用android.security.KeyStoreException加密时,使用此密钥失败:密钥用户未经身份验证 默认情况下,
setUserAuthenticationRequired(true)
意味着每次使用密钥都需要授权,这种授权的唯一方式是通过指纹认证
您可以使用指定希望密钥在上次授权后的特定时间内可用。在本例中,是密钥,不管它们是什么。虽然我没有解决您问题的方法,但我昨天从谷歌那里得到了一份交叉指南,它可能会对您有很大帮助:从错误消息的外观来看,特别有趣的可能是密钥使用需要用户身份验证部分。