我目前正在开发基于客户端-服务器架构的 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 的确切用途是什么?我可以在哪里使用它?