7

我目前正在开发基于客户端-服务器架构的 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/' 目录下生成 Keystore 相关文件(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 的确切用途是什么?我可以在哪里使用它?

4

1 回答 1

6

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

于 2015-03-18T07:50:31.757 回答