设备密码更改后,AndroidKeyStore消失了

时间:2014-09-22 06:41:02

标签: android security keystore android-keystore data-security

我目前正在开发基于客户端 - 服务器架构的android应用程序。为了数据安全,我使用公钥 - 私钥对进行数据加密和签名。我使用AndroidKeyStore存储密钥对。以下是生成密钥对的代码:

KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(
        mContext)
        .setAlias(mPrivateKeyAlias) 
        .setSubject(new X500Principal("CN=" + mPrivateKeyAlias))
        .setSerialNumber(
                BigInteger.valueOf(System.currentTimeMillis()))
        .setStartDate(start.getTime())
        .setEndDate(end.getTime()).setKeySize(2048).build();

KeyPairGenerator kpGenerator = KeyPairGenerator.getInstance(
        "RSA",
        "AndroidKeyStore");

kpGenerator.initialize(spec);
// Key Pair will be saved in AndroidKeyStore
KeyPair pair = kpGenerator.generateKeyPair();

执行此代码后,将在' / data / misc / keystore / user_0 /'生成密钥库相关文件(CERT和PKEY文件)。目录。 我正在加密应用程序敏感数据,如auth-token,并出于安全原因将其保存到Shared Pref。

但是现在当用户更改设备密码或PIN时,密钥库文件将被删除,因为用于密钥库加密的Masterkey是使用设备凭据生成的。

现在要解决此问题,我尝试将公钥 - 私钥对保留在RAM中并且密码更改时。从DeviceAdminReceiver的onPasswordChanged(Context context,Intent intent)方法,我执行下面的代码:

KeyStore keyStore = KeyStore
        .getInstance("AndroidKeyStore");
keyStore.load(null);
keyStore.setKeyEntry(mPrivateKeyAlias, mPrivateKey.getPrivateKey(),
        null, new Certificate[] { mPrivateKey.getCertificate() });

但是,在此代码之后,只有CERT文件在'/data/misc/keystore/user_0/'目录下创建,而在使用私钥解密时,会产生一些无效的签名错误。

另外,我已经使用私钥与服务器,加密数据共享我的公钥,因此创建新密钥对不是更好的解决方案。

那么,在设备密码更改后如何保留我的公共私钥对?如果没有解决方法,AndroidKeyStore的确切用途是什么?我在哪里可以使用它?

1 个答案:

答案 0 :(得分:5)

此问题已由Google在Android 5.0(Lollipop)版本中修复。但是,对于以前的Android版本,您将不得不忍受这个问题。 :(