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

如何在Dart/Flutter中复现C#字符串加密逻辑?

Flutter 复现 C# Rfc2898DeriveBytes 密码哈希逻辑

先明确C#代码的核心逻辑:

  • 使用PBKDF2算法(基于HMAC-SHA1,Rfc2898DeriveBytes默认哈希算法为SHA1)
  • 生成16位随机盐
  • 迭代次数1000次,生成32位派生密钥
  • 按 [占位字节(1位) + 盐(16位) + 派生密钥(32位)] 的结构拼接,最后转Base64

你之前尝试AES是方向错误,这段C#代码是哈希而非加密,用pointycastle包即可实现对应逻辑:

实现步骤

  1. 添加依赖到pubspec.yaml:
dependencies:
  pointycastle: ^3.7.3
  1. 实现哈希函数:
import 'dart:convert';
import 'dart:typed_data';
import 'package:pointycastle/pointycastle.dart';

String hashPassword(String password) {
  if (password == null) throw ArgumentError('password cannot be null');

  // 生成16位安全随机盐,对应C#自动生成盐的逻辑
  final secureRandom = FortunaRandom();
  final seedSource = Random.secure();
  final seeds = List<int>.generate(32, (_) => seedSource.nextInt(256));
  secureRandom.seed(KeyParameter(Uint8List.fromList(seeds)));
  final salt = secureRandom.nextBytes(16);

  // 配置PBKDF2参数:HMAC-SHA1、迭代1000次、生成32位密钥
  final pbkdf2 = PBKDF2KeyDerivator(HMac(Sha1Digest(), 64));
  pbkdf2.init(Pbkdf2Parameters(
    Uint8List.fromList(salt),
    1000,
    32,
  ));

  // 生成派生密钥,对应C#的GetBytes(32)
  final derivedKey = pbkdf2.process(utf8.encode(password));

  // 拼接字节数组,对应C#的Buffer.BlockCopy逻辑
  final resultBytes = Uint8List(49);
  resultBytes.setRange(1, 17, salt);       // 索引1-16存放16位盐
  resultBytes.setRange(17, 49, derivedKey); // 索引17-48存放32位派生密钥

  // 转Base64返回
  return base64.encode(resultBytes);
}

关键对应说明

  • 随机盐生成:用FortunaRandom安全随机数生成器,和C#自动生成盐的安全性一致
  • PBKDF2参数:完全匹配C#的迭代次数、密钥长度、哈希算法
  • 字节拼接逻辑:和C#的Buffer.BlockCopy操作一一对应,确保最终字节结构完全相同

内容的提问来源于stack exchange,提问作者luis8elias

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 04:25:23