Flutter教程一键登录RSA加密解密实现
在Flutter中实现一键登录功能时,如何正确集成RSA加密解密?目前参照教程调用加密接口后,客户端返回的数据始终解密失败,但相同加密逻辑在Android原生端测试正常。具体现象是:使用公钥加密的登录请求数据发送到服务端后,服务端返回的加密响应用私钥解密时抛出"Bad Padding Exception"。已确认密钥对匹配,且尝试了flutter_rsa和pointycastle两种库。是否需要特别处理Flutter的加密编码格式?求完整实现流程或排查思路。
3 回复
以下为Flutter实现一键登录时RSA加密解密的简单教程:
- 添加依赖:在pubspec.yaml中加入
pointycastle
库用于RSA加密。
dependencies:
pointycastle: ^3.4.0
-
生成公私钥对:使用Java或后端生成RSA密钥对,并将公钥提供给前端。
-
Flutter端实现:
-
初始化RSA:
import 'package:pointycastle/export.dart'; void generateKeyPair() { var keyGenerator = KeyGenerator('RSA').init( ParametersWithRandom(BaseParameters(2048), SecureRandom())); AsymmetricKeyPair<PrivateKey, PublicKey> pair = keyGenerator.generateKeyPair(); // 获取公私钥 }
-
加密:
String encrypt(String publicKey, String data) { var encryptor = PaddedBlockCipherImpl(PKCS1Encoding(), RSAEngine()) ..init(true, PublicKeyParameter(RSAKeyParser().parse(publicKey))); List<int> encrypted = encryptor.process(Utf8Encoder().convert(data)); return Base64Encoder().convert(encrypted); }
-
解密(需在服务端完成)。
-
-
服务器验证并解密:服务端使用私钥解密数据,校验用户身份。
-
注意事项:确保密钥安全传输,避免泄露。建议结合HTTPS增强安全性。
更多关于Flutter教程一键登录RSA加密解密实现的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
以下为Flutter中实现一键登录时的RSA加密解密教程:
- 添加依赖:
dependencies:
pointycastle: ^3.4.0
convert: ^3.0.1
- 生成公钥和私钥: 使用Pointycastle库生成RSA密钥对。
import 'package:pointycastle/api.dart';
import 'package:pointycastle/key_generators/api.dart';
final keyGenerator = KeyGenerator('RSA').init(Params.empty());
final asymmetricKeyPair = keyGenerator.generateKeyPair();
final privateKey = asymmetricKeyPair.privateKey;
final publicKey = asymmetricKeyPair.publicKey;
- 加密数据: 将用户输入的数据用公钥加密。
import 'package:convert/convert.dart';
final input = utf8.encode("待加密的登录信息");
final encryptor = PaddedBlockCipherImpl(PKCS1Padding(), RSAEngine())
..init(true, PublicKeyParameter<AsymmetricKey>(publicKey));
final encrypted = encryptor.process(hex.decode(input));
- 解密数据: 后端收到加密数据后,使用私钥解密。
final decryptor = PaddedBlockCipherImpl(PKCS1Padding(), RSAEngine())
..init(false, PrivateKeyParameter<AsymmetricKey>(privateKey));
final decrypted = decryptor.process(encrypted);
final result = utf8.decode(decrypted);
这样就完成了Flutter中的RSA加密解密过程。注意:实际项目中需妥善保管私钥,并通过安全渠道传输公钥。
Flutter RSA加密解密实现教程
准备工作
首先需要在pubspec.yaml
中添加加密库依赖:
dependencies:
pointycastle: ^3.1.1
encrypt: ^5.0.1
RSA密钥对生成
import 'package:encrypt/encrypt.dart';
import 'package:pointycastle/asymmetric/api.dart';
// 生成RSA密钥对
AsymmetricKeyPair<RSAPublicKey, RSAPrivateKey> generateRSAkeyPair() {
final keyGen = RSAKeyGenerator();
final random = FortunaRandom();
random.seed(KeyParameter(List<int>.generate(32, (i) => i)));
final params = RSAKeyGeneratorParameters(
BigInt.parse('65537'),
2048,
64,
);
keyGen.init(ParametersWithRandom(params, random));
return keyGen.generateKeyPair();
}
RSA加密实现
String rsaEncrypt(String plainText, RSAPublicKey publicKey) {
final encrypter = Encrypter(RSA(publicKey: publicKey));
return encrypter.encrypt(plainText).base64;
}
RSA解密实现
String rsaDecrypt(String encryptedText, RSAPrivateKey privateKey) {
final encrypter = Encrypter(RSA(privateKey: privateKey));
return encrypter.decrypt(Encrypted.fromBase64(encryptedText));
}
完整使用示例
void main() {
// 生成密钥对
final keyPair = generateRSAkeyPair();
final publicKey = keyPair.publicKey;
final privateKey = keyPair.privateKey;
// 待加密数据
const originalText = 'Flutter一键登录测试数据';
// 加密
final encrypted = rsaEncrypt(originalText, publicKey);
print('加密后: $encrypted');
// 解密
final decrypted = rsaDecrypt(encrypted, privateKey);
print('解密后: $decrypted');
}
注意:实际应用中,通常服务器会提供公钥用于加密,私钥保存在服务器用于解密。本示例展示了完整的生成、加密、解密流程。