Flutter导入后端JWK公钥:如何将e、n转为List<int>
Flutter中JWK公钥字符串转RsaPublicKey类型的解决方法
问题核心
服务器返回的JWK公钥中,e(公钥指数)和n(模值)是URL安全的Base64字符串(例如e: AQAB),但RsaPublicKey要求这两个参数为List<int>类型;部分其他公钥实现则要求传入BigInt,需完成这两种类型的转换。
解决步骤
1. Base64字符串转List
JWK采用URL安全的Base64编码(替换+为-、/为_,可能省略末尾的=),需先补全缺失的padding再解码:
// 补全Base64 padding的工具函数 String _padBase64(String input) { int padLength = (4 - input.length % 4) % 4; return input.padRight(input.length + padLength, '='); } // 转换e和n为List<int> String eStr = key['e']; String nStr = key['n']; List<int> eBytes = base64UrlDecode(_padBase64(eStr)); List<int> nBytes = base64UrlDecode(_padBase64(nStr));
2. List转BigInt(适配其他公钥类型)
如果使用的公钥实现要求传入BigInt,可将字节数组转换为对应类型:
BigInt eBigInt = BigInt.parse( eBytes.map((byte) => byte.toRadixString(16).padLeft(2, '0')).join(), radix: 16, ); BigInt nBigInt = BigInt.parse( nBytes.map((byte) => byte.toRadixString(16).padLeft(2, '0')).join(), radix: 16, );
修改后的完整代码示例
import 'dart:convert'; import 'dart:typed_data'; import 'package:jose/jose.dart'; // ... 你的请求逻辑 ... var signature = JsonWebSignature.fromCompactSerialization(response.body); var payload = signature.unverifiedPayload; Map<String, dynamic> jwkData = jsonDecode(payload.jsonContent["jwk"]); // 补全Base64 padding String _padBase64(String input) { int padLength = (4 - input.length % 4) % 4; return input.padRight(input.length + padLength, '='); } // 转换为RsaPublicKey所需的List<int> List<int> eBytes = base64UrlDecode(_padBase64(jwkData['e'])); List<int> nBytes = base64UrlDecode(_padBase64(jwkData['n'])); // 生成RsaPublicKey并转为Jwk PublicKey rsaKey = RsaPublicKey(e: eBytes, n: nBytes); Jwk jwk = Jwk.fromPublicKey(rsaKey);
额外提示
部分JWK处理库支持直接从JSON加载完整密钥,无需手动转换字段,例如Jwk.fromJson(jwkData),可优先尝试这种简化方式。
内容的提问来源于stack exchange,提问作者Zophirel
相关产品推荐
相关产品推荐

