Flutter中RSA密钥对生成陷入无限计算问题求助
Flutter RSA密钥对生成陷入无限计算的解决办法
核心原因
RSA密钥对生成属于CPU密集型操作,直接在Flutter主线程执行会阻塞UI线程,导致程序看起来像陷入无限计算;另外部分SecureRandom实现在移动设备上效率低下,也会拖慢密钥生成速度。
解决方案
1. 将密钥生成移至隔离线程(Isolate)
Flutter的Isolate可以在后台线程执行耗时操作,避免阻塞主线程。改造你的PointyCastle代码如下:
import 'dart:isolate'; import 'package:flutter/widgets.dart'; import 'package:pointycastle/pointycastle.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); // 启动隔离线程执行密钥生成 final receivePort = ReceivePort(); await Isolate.spawn(_generateKeyPairInIsolate, receivePort.sendPort); // 接收隔离线程返回的密钥对 final pair = await receivePort.first as AsymmetricKeyPair<RSAPublicKey, RSAPrivateKey>; print(pair.privateKey.toString()); print("keys generated"); } // 隔离线程中执行的密钥生成逻辑 void _generateKeyPairInIsolate(SendPort sendPort) { final pair = generateRSAkeyPair(exampleSecureRandom()); sendPort.send(pair); } AsymmetricKeyPair<RSAPublicKey, RSAPrivateKey> generateRSAkeyPair( SecureRandom secureRandom, {int bitLength = 2048}) { final keyGen = RSAKeyGenerator() ..init(ParametersWithRandom( RSAKeyGeneratorParameters(BigInt.parse('65537'), bitLength, 64), secureRandom)); final pair = keyGen.generateKeyPair(); final myPublic = pair.publicKey as RSAPublicKey; final myPrivate = pair.privateKey as RSAPrivateKey; return AsymmetricKeyPair<RSAPublicKey, RSAPrivateKey>(myPublic, myPrivate); } SecureRandom exampleSecureRandom() { final secureRandom = FortunaRandom(); final seedSource = Random.secure(); final seeds = <int>[]; for (int i = 0; i < 32; i++) { seeds.add(seedSource.nextInt(255)); } secureRandom.seed(KeyParameter(Uint8List.fromList(seeds))); return secureRandom; }
2. 替换高效的SecureRandom实现
如果使用FortunaRandom效率过低,可以尝试使用平台原生的安全随机数生成能力,或第三方库优化随机数生成速度,进而加快密钥对生成流程。
3. 临时降低密钥长度测试(仅用于调试)
在性能较低的设备上测试时,可临时将密钥长度改为1024位(生产环境必须使用2048位及以上保证安全性),验证是否能正常生成密钥,以此排除性能瓶颈问题:
// 调用生成方法时指定bitLength参数 final pair = generateRSAkeyPair(exampleSecureRandom(), bitLength: 1024);
针对rsa_encrypt库的改造
同样,对于rsa_encrypt库的代码,也需要将密钥生成逻辑移至Isolate:
import 'dart:isolate'; import 'package:flutter/widgets.dart'; import 'package:rsa_encrypt/rsa_encrypt.dart'; import 'package:pointycastle/api.dart' as crypto; void main() async { WidgetsFlutterBinding.ensureInitialized(); final receivePort = ReceivePort(); await Isolate.spawn(_getKeyPairInIsolate, receivePort.sendPort); final keyPair = await receivePort.first as crypto.AsymmetricKeyPair; print(keyPair); } void _getKeyPairInIsolate(SendPort sendPort) async { var helper = RsaKeyHelper(); final keyPair = await helper.computeRSAKeyPair(helper.getSecureRandom()); sendPort.send(keyPair); }
内容的提问来源于stack exchange,提问作者Yousuf Ali
相关产品推荐
相关产品推荐

