我目前正在开发基于客户端 - 服务器架构的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的确切用途是什么?我在哪里可以使用它?
答案 0 :(得分:5)
此问题已由Google在Android 5.0(Lollipop)版本中修复。但是,对于以前的Android版本,您将不得不忍受这个问题。 :(