Flutter教程一键登录RSA加密解密

我在使用Flutter实现一键登录功能时遇到RSA加密解密的问题。具体场景是:客户端需要将用户登录信息用RSA公钥加密后传给服务器,服务器用私钥解密验证。目前遇到了以下几个问题:

  1. 在Flutter中应该使用哪个RSA加密库比较合适?
  2. RSA加密后的数据格式应该如何转换才能安全传输?
  3. 服务器端用Java开发的,两边加密解密会不会出现兼容性问题?
  4. 有没有完整的Flutter RSA加密解密教程可以参考? 特别希望能分享一个完整的实现案例,包括客户端加密和服务器端解密的代码示例。
3 回复

以下为Flutter实现一键登录时的RSA加密解密步骤:

  1. 添加依赖:在pubspec.yaml中加入pointycastle库用于RSA算法。
dependencies:
  pointycastle: ^3.4.0
  1. 生成公钥私钥对
import 'package:pointycastle/api.dart';
import 'package:pointycastle/key_generators/api.dart';
import 'package:pointycastle/random/secure_random.dart';

void generateKeys() {
  var secureRandom = SecureRandom("Fortuna");
  var keyGenerator = KeyGenerator("RSA").init(ParamsBuilder().build());
  AsymmetricKeyPair pair = keyGenerator.generateKeyPair();
  PrivateKey privateKey = pair.privateKey;
  PublicKey publicKey = pair.publicKey;
}
  1. 加密数据
Uint8List encrypt(String data, PublicKey publicKey) {
  var encryptor = PaddedBlockCipherImpl(Padding("PKCS1"), RSAEngine())
    ..init(true, PublicKeyParameter(publicKey));
  return encryptor.process(Uint8List.fromList(data.codeUnits));
}
  1. 解密数据
String decrypt(Uint8List encryptedData, PrivateKey privateKey) {
  var decryptor = PaddedBlockCipherImpl(Padding("PKCS1"), RSAEngine())
    ..init(false, PrivateKeyParameter(privateKey));
  Uint8List decryptedBytes = decryptor.process(encryptedData);
  return String.fromCharCodes(decryptedBytes);
}

使用时先生成密钥对,然后客户端用公钥加密数据发送到服务器,服务器用私钥解密。

更多关于Flutter教程一键登录RSA加密解密的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter实现一键登录时,RSA加密解密可以提升安全性。首先确保安装pointycastleflutter_secure_storage库。

  1. 生成RSA密钥对:使用Pointycastle生成公钥和私钥。

    import 'package:pointycastle/api.dart';
    import 'package:pointycastle/key_generators/api.dart';
    
    AsymmetricKeyPair<RSAPublicKey, RSAPrivateKey> generateKeys() {
        final keyGenerator = KeyGenerator('RSA')..init(ParametersWithRandom(PrivateKeyParameter<num>(0), SecureRandom()));
        return keyGenerator.generateKeyPair();
    }
    
  2. 加密数据:客户端使用公钥加密用户名和密码。

    RSAEngine engine = RSAEngine();
    engine.init(true, PublicKeyParameter<RSAPublicKey>(publicKey));
    List<int> encrypted = engine.process(data);
    
  3. 解密数据:服务器端使用私钥解密。

    RSAEngine engine = RSAEngine();
    engine.init(false, PrivateKeyParameter<RSAPrivateKey>(privateKey));
    List<int> decrypted = engine.process(encryptedData);
    
  4. 存储密钥:利用flutter_secure_storage安全保存密钥。

    import 'package:flutter_secure_storage/flutter_secure_storage';
    
    const storage = FlutterSecureStorage();
    await storage.write(key: 'privateKey', value: privateKey);
    String storedKey = await storage.read(key: 'privateKey');
    

通过这种方式,可以有效保护用户登录信息的安全性。

Flutter RSA加密解密教程

一键登录RSA加密实现

在Flutter中实现RSA加密解密需要使用pointycastleencrypt等加密库。以下是使用encrypt库实现RSA加密解密的示例:

import 'package:encrypt/encrypt.dart';
import 'package:pointycastle/asymmetric/api.dart';

// 生成RSA密钥对
final keyPair = RSAKeyGenerator().generateKeyPair();

// 获取公钥和私钥
final publicKey = keyPair.publicKey as RSAPublicKey;
final privateKey = keyPair.privateKey as RSAPrivateKey;

// 加密函数
String rsaEncrypt(String plainText, RSAPublicKey publicKey) {
  final encrypter = Encrypter(RSA(publicKey: publicKey));
  return encrypter.encrypt(plainText).base64;
}

// 解密函数
String rsaDecrypt(String encryptedText, RSAPrivateKey privateKey) {
  final encrypter = Encrypter(RSA(privateKey: privateKey));
  return encrypter.decrypt(Encrypted.fromBase64(encryptedText));
}

一键登录示例

对于一键登录,通常需要与服务器配合完成认证过程:

  1. 客户端生成RSA密钥对
  2. 将公钥发送到服务器
  3. 服务器用公钥加密临时token返回
  4. 客户端用私钥解密token完成验证
// 一键登录示例流程
Future<void> oneClickLogin() async {
  // 1. 生成密钥对
  final keyPair = RSAKeyGenerator().generateKeyPair();
  
  // 2. 发送公钥到服务器
  final response = await http.post(
    Uri.parse('https://your-server.com/login'),
    body: {'publicKey': keyPair.publicKey.toString()}
  );
  
  // 3. 获取加密的token
  final encryptedToken = response.body['token'];
  
  // 4. 解密token完成验证
  final token = rsaDecrypt(encryptedToken, keyPair.privateKey as RSAPrivateKey);
  print('登录成功,token: $token');
}

注意:实际应用中应该使用更安全的密钥管理方式,并配合HTTPS传输。

回到顶部