Firebase Dynamic Links弃用后Flutter深度链接敏感参数加密方案咨询
Firebase Dynamic Links弃用说明
弃用通知:Firebase Dynamic Links已被弃用,未使用该服务的项目不应再采用。该服务将于2025年8月25日停止运营。Firebase即将弃用
firebase_dynamic_links插件,Flutter中推荐使用官方深度链接方案。
你已完成官方深度链接的配置,运行正常:
<meta-data android:name="flutter_deeplinking_enabled" android:value="true" /> <intent-filter android:autoVerify="true"> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="http" android:host="somedomain.fr" /> <data android:scheme="https" /> </intent-filter>
针对你需要加密新闻分享链接敏感数据的需求,有以下可行实现方案:
实现步骤
1. 选择对称加密算法
推荐使用AES对称加密算法,适配客户端加密/解密场景:
- 密钥需安全存储,禁止硬编码在代码中,可借助
flutter_secure_storage插件将密钥存入设备安全存储区 - 优先选择GCM模式(自带数据校验,安全性更高),或CBC模式配合16位初始向量(IV)
2. 加密敏感参数生成分享链接
将需要隐藏的敏感数据(如文章id)加密为字符串,生成包含加密内容的分享链接:
- 原链接:
https://somedomain.fr/articles?id=10 - 加密后链接:
https://somedomain.fr/articles?token=U2FsdGVkX18w...(示例为AES加密后的Base64组合字符串)
3. 深度链接接收后的解密处理
应用通过深度链接获取到token参数后,用同一密钥和算法解密,得到原始文章id,再跳转至对应文章页面。
代码示例
使用encrypt插件实现核心逻辑:
- 添加依赖:
dependencies: encrypt: ^5.0.1 flutter_secure_storage: ^9.0.0
- 加密函数:
import 'package:encrypt/encrypt.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; final storage = FlutterSecureStorage(); // 从安全存储获取加密密钥(需提前存入) Future<Key> _getEncryptionKey() async { String? keyStr = await storage.read(key: 'deeplink_enc_key'); return Key.fromUtf8(keyStr!); } // 加密文章ID Future<String> encryptArticleId(String id) async { final key = await _getEncryptionKey(); final iv = IV.fromLength(16); final encrypter = Encrypter(AES(key, mode: AESMode.cbc)); final encrypted = encrypter.encrypt(id, iv: iv); // 组合IV和加密内容,方便解密时复用IV return '${iv.base64}:${encrypted.base64}'; }
- 解密函数:
Future<String?> decryptArticleId(String token) async { try { final parts = token.split(':'); if (parts.length != 2) return null; final key = await _getEncryptionKey(); final iv = IV.fromBase64(parts[0]); final encrypter = Encrypter(AES(key, mode: AESMode.cbc)); return encrypter.decrypt(Encrypted.fromBase64(parts[1]), iv: iv); } catch (e) { return null; // 解密失败返回null,可添加错误提示 } }
- 深度链接处理:
// 处理接收到的深度链接 void handleDeepLink(Uri uri) async { String? token = uri.queryParameters['token']; if (token != null) { String? articleId = await decryptArticleId(token); if (articleId != null) { // 跳转至对应文章页面 // Navigator.push(context, MaterialPageRoute(builder: (_) => ArticlePage(id: articleId))); } } }
额外注意事项
- 加密后的字符串需用
Uri.encodeComponent()做URL编码,避免特殊字符导致链接失效 - 可在加密内容中加入过期时间戳,解密时校验有效性,进一步提升安全性
- 确保iOS和Android客户端使用完全一致的加密算法、密钥和参数,避免跨平台解密失败
内容的提问来源于stack exchange,提问作者Balaji
相关产品推荐
相关产品推荐

