You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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插件实现核心逻辑:

  1. 添加依赖:
dependencies:
  encrypt: ^5.0.1
  flutter_secure_storage: ^9.0.0
  1. 加密函数:
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}';
}
  1. 解密函数:
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,可添加错误提示
  }
}
  1. 深度链接处理:
// 处理接收到的深度链接
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 05:12:48