VerifyData的性能如此糟糕以至於該函數幾乎無用,或者我在下面的代碼中做了非常錯誤的操作?RSACryptoServiceProvider.VerifyData的爛性能?
open System
open System.Security.Cryptography
let keySize = 1024 // bits
let testDataLen = 1000
let iterations = 100
let hashAlg = "SHA1"
let timer f =
let start = DateTime.Now
f() |> ignore
let finish = DateTime.Now
finish - start
let bench() =
use rsaSP = new RSACryptoServiceProvider(keySize)
let rnd = Random()
let data = Array.create testDataLen 0uy
rnd.NextBytes data
let signature = rsaSP.SignData(data, hashAlg)
let isValid = [for i in 1..iterations -> rsaSP.VerifyData(data, hashAlg, signature)]
|> List.forall id
if not isValid then failwith "Bad signature."
printfn "%d iterations took %A" iterations (timer bench)
在2.1 GHz雙核32位XP上,100次調用VerifyData需要3秒。
我也嘗試用重用的SHA1CryptoServiceProvider對象替換「SHA1」字符串(在循環中沒有新的實例化),但這沒有什麼區別。
對於單個VerifyData調用需要0.03秒 - 這裏發生了什麼?
編輯/更新:剛剛嘗試編寫F#函數,使用BigInteger.ModPow,我自己的填充函數和SHA1CryptoServiceProvider.ComputeHash。 100次迭代在0.07秒內完成,比RSACryptoServiceProvider快40倍。
(這些結果一定是錯誤的,稍後會修改)
在這一天結束時,性能下降不是一個錯誤,它的一個特點。 http://codahale.com/how-to-safely-store-a-password/ – Juliet 2011-03-14 21:23:06
@Juliet:這隻適用於你想減慢暴力強度的情況,而且不應該通過慢速實現來完成,但設計相當緩慢。 – 2011-03-14 21:28:40
@Juliet:我所做的不好的表現是檢查簽名,然後你通常只能訪問公鑰。 – 2011-03-14 23:46:05