Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ';密钥用户未经身份验证';,理解Android密钥库_Java_Android_Security_Keystore - Fatal编程技术网

Java ';密钥用户未经身份验证';,理解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

我正试图在Android应用程序中安全地存储一个秘密。为此,我想使用Android密钥库中的密钥对它们进行加密,类似于在iOS上使用密钥链。我跟随了,只需要考虑Android 6 +< /p> 据我所知,密钥库是由Android提供的安全存储。但是,我并不真正理解是谁解锁了对密钥库的访问。我目前所做的是使用以下方法创建密钥:

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)
意味着每次使用密钥都需要授权,这种授权的唯一方式是通过指纹认证


您可以使用指定希望密钥在上次授权后的特定时间内可用。在本例中,是密钥,不管它们是什么。

虽然我没有解决您问题的方法,但我昨天从谷歌那里得到了一份交叉指南,它可能会对您有很大帮助:从错误消息的外观来看,特别有趣的可能是密钥使用需要用户身份验证部分。