android - RxJava 计算线程 + Android Keystore 阻塞 UI?
问题描述
以下最小示例(调用一次)在我的摩托罗拉 G6 上阻止 UI。它出什么问题了?密钥库是否在幕后某处的主线程上执行某些操作?(编辑:我怀疑 RAM 问题。将 RSA 密钥大小更改为 2048 后,它好多了,尽管 UI 仍然有一个小暂停)
Observable.fromCallable(new Callable<Boolean>() {
@Override
public Boolean call() throws Exception {
KeyGenerator generator = KeyGenerator.getInstance("AES");
generator.init(256, new SecureRandom());
Key key = generator.generateKey();
Calendar start = Calendar.getInstance();
Calendar end = Calendar.getInstance();
end.add(Calendar.YEAR, 100);
KeyStore.getInstance("AndroidKeyStore").load(null);
KeyPairGenerator keyGen = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_RSA, "AndroidKeyStore");
KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(context)
.setAlias("some_id")
.setKeySize(3072)
.setKeyType(KeyProperties.KEY_ALGORITHM_RSA)
.setStartDate(start.getTime())
.setEndDate(end.getTime())
.setSerialNumber(BigInteger.ONE)
.setSubject(new X500Principal("CN = Secured Preference Store, O = Some Name"))
.build();
keyGen.initialize(spec);
KeyPair keyPair = keyGen.generateKeyPair();
PublicKey rsaPublicKey = keyPair.getPublic();
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, rsaPublicKey);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
CipherOutputStream cipherOutputStream = new CipherOutputStream(outputStream, cipher);
cipherOutputStream.write(key.getEncoded());
cipherOutputStream.close();
return true;
}
}).subscribeOn(Schedulers.computation()).observeOn(Schedulers.computation()).subscribe();
解决方案
推荐阅读
- datatables - 使用数据表的列 nowrap 不起作用
- selenium - 如何比较和验证托管在两个不同环境中的网站的内容是否相同?
- python - 如何将预编译的二进制文件添加到 python 项目(云函数 python)?
- javascript - 在 Three.js 中控制自定义几何图形的缩放
- docker - docker:来自守护进程的错误响应:驱动程序在端点 Web 上编程外部连接失败:启动用户级代理时出错:监听 tcp 0.0.0
- sql - 如何创建一个视图,排除与 CASE 语句中设置的任何条件不匹配的数据?
- node.js - Cloud Functions for Firestore:访问父集合数据
- xml - XPath 没有得到任何节点
- ios - Swift:Firestore 子集合、自定义对象和监听器
- mysql - --skip-grant-tables 选项不能执行语句