是否有任何允許對記憶體進行特定限制的 scrypt 實現?
回答者評論說 scrypt 的記憶體使用“只是 r 的函式”。 $ : $ 但是,在我 5 天前的評論之一中,他
沒有解決我關於它也取決於 N 的論點。
我不知何故得到了這樣的印象,即 scrypt 除了
它的主要工作因素外,還提供了一個單獨的記憶因素。 $ : $ 但是,(原始?) scrypt 論文沒有這樣的參數。
scrypt 的任何實現是否提供了一種在
不限制其執行時的情況下限制其記憶體使用的方法?
看那篇論文,我發現有一種明顯的方法可以做到這一點:在
ROMix 的定義(第 6 頁)中,添加一個輸入 M 並將步驟 2 和 7 中的 N 的實例替換為 M。
或者,一個可以用 max(M,N) 替換這兩個 N,並將
步驟 6 中的 N 替換為 max(N,(2*N)-M) 或類似的東西。
定義 4:密鑰導出函式 scrypt 定義為 scrypt(P, S, N, r, p, dkLen) = MFcryptHMAC SHA256,SMixr(P, S, N, p, dkLen)
p 和 dkLen 的大小限制是由於 PBKDF 生成的密鑰長度的相應限製而存在的。
scrypt 的使用者可以根據可用的記憶體量和計算能力、記憶體子系統的延遲-頻寬乘積以及所需的並行度來調整參數 N、r 和 p;目前,採用 r = 8 和 p = 1 似乎會產生良好的結果,但隨著記憶體延遲和 CPU 並行度的增加,r 和 p 的最佳值可能會增加。另請注意,由於 SMix 的計算是獨立的,因此可以使用較大的 p 值來增加 scrypt 的計算成本,而不會增加記憶體使用量;因此,即使 CPU 功率和記憶體容量的增長率出現分歧,我們也可以預期 scrypt 仍然有用。
來源。
這個 SO 答案更清楚地闡述了這些因素。
$ N $ :一般工作因子,迭代次數。
$ r $ : 用於底層雜湊的塊大小;微調相對記憶體成本。
$ p $ : 並行化因子;微調相對 CPU 成本。
來源。
如果你想增加記憶硬度,提高r。這也會增加執行時間,因此您可能希望同時降低 N。
如果您使用的是 node,node scrypt比您的標準 Nrp 參數做得更好:
scrypt.params(maxtime, maxmem, maxmemfrac, function(err, scryptParameters) { // scryptParameters contains the standard Nrp generated based on your inputs });
通過這種方式,您可以以更易於理解的方式控制參數,限制使用多少 cpu 時間、使用多少記憶體以及使用的可用記憶體的最大百分比。