我正在使用通过 Isopoh.Cryptography.Argon2 NuGet 包提供的 C# Argon2 实现(最新版本 1.1.2 来自此处:https://github.com/mheyman/Isopoh.Cryptography.Argon2)。生成和验证 Argon2 哈希值有时很快,有时非常慢(几秒钟),尽管我知道下面的配置是低成本的。
我的Argon2配置如下:
Type = Argon2Type.HybridAddressing,
Version = Argon2Version.Nineteen,
MemoryCost = 16, //I had this at 2048 and lowered to 16 for testing, still slow
TimeCost = 2,
Lanes = 2,
Threads = 1,
HashLength = 32,
ClearPassword = true,
ClearSecret = true
Run Code Online (Sandbox Code Playgroud)
这会产生显示以下配置标头的 Argon2 哈希值:
$argon2id$v=19$m=16,t=2,p=2$<<hash>>
Run Code Online (Sandbox Code Playgroud)
我编写了一个性能分析器,发现即使在重复测试中,在大约 10 到 12 次迭代之后,每次迭代的实现都会(大部分)变慢。速度慢了约 2 个数量级或更多(从约 10 毫秒到几秒),这让我相信存在垃圾收集/内存泄漏问题。
我发现这个问题确实与 Argon2 实现和/或垃圾收集有关。
在生成散列(其中包括散列实例和实例的包装,这两个实例在问题发生时已经存在)GC.Collect()后立即强制进行垃圾收集(我通常不建议手动执行)可以消除以下奇怪的差异哈希生成速度。usingSecureArray<byte>
它还允许我将参数调整到更安全的设置,同时保持在约 100-150 毫秒的生成时间范围内。