我需要为PBKDF2选择一个HMAC函数。
我使用的是.net,所以我没有选择使用SHA3。乍一看,根据这是托马斯·波宁的回答的说法,SHA512似乎是最好的选择。
然而,我听说与SHA2相比,SHA1还有一些可能的缺点。其中一个可能与量子计算机有关。(是的,我知道它们还不实用,但为什么不选择更好而不是更糟呢?)
因此,底线是-我应该使用HMACSHA1还是HMACSHA2 (512)?或者换句话说,上述答案是建议始终使用SHA2还是取决于某些因素?
另外,我想验证一下,我正确地理解了,在任何情况下,我只应该要求它提供本机输出(HMACSHA1 1为160位,HMACSHA1 2-512为512位-对吗?)对吗?
我需要只使用Microsoft库。我需要实现一个密码拉伸功能与反馈-多远的功能是完成的。因此,我不能使用Rfc2898DeriveBytes (它不提供反馈),也不能使用SHA3 (除非我自己编写它)。但是我已经自己编写了PBKDF2,我宁愿使用内置的HMAC,也不愿写它。)
发布于 2018-01-21 21:29:56
SHA-2的唯一缺点是SHA-2比SHA-1慢一点.
在这种情况下,这是没有任何实际意义的,因为你试图使一些缓慢的计算,这只是一个问题,增加迭代次数,以使它花费一定数量的位操作在串行。
然而,请考虑使用现代内存硬密码散列或argon2代替PBKDF2,以限制使用高并行低内存GPU、FPGA或ASIC的攻击者比使用普通CPU的维护者获得的优势。
在SHA-2家族中,SHA-512比CPU上的SHA-256略快一些,其本地64位整数算法是当今绝大多数个人计算设备。所以使用SHA-512而不是SHA-256为防御者提供了一个小小的优势。
发布于 2018-01-22 19:44:48
您应该选择这样的功能,使配备CPU的防御程序相对于基于GPU的攻击者(后者是最有可能的攻击者)具有最大的优势。我们怎么才能找到这个?首先,让我们使用OpenSSL对CPU上的散列函数进行基准测试。以下是我电脑上的一些结果(一台64位英特尔机器,大约4岁):
$ openssl speed sha1 sha256 sha512
To get the most accurate results, try to run this
program when this computer is idle.
Doing sha1 for 3s on 16 size blocks: 8500388 sha1's in 2.99s
Doing sha1 for 3s on 64 size blocks: 6084902 sha1's in 2.99s
Doing sha1 for 3s on 256 size blocks: 3194162 sha1's in 2.98s
Doing sha1 for 3s on 1024 size blocks: 1159960 sha1's in 2.99s
Doing sha1 for 3s on 8192 size blocks: 169801 sha1's in 3.00s
Doing sha256 for 3s on 16 size blocks: 6272034 sha256's in 2.99s
Doing sha256 for 3s on 64 size blocks: 3709199 sha256's in 2.98s
Doing sha256 for 3s on 256 size blocks: 1658154 sha256's in 2.99s
Doing sha256 for 3s on 1024 size blocks: 510230 sha256's in 2.99s
Doing sha256 for 3s on 8192 size blocks: 68516 sha256's in 2.99s
Doing sha512 for 3s on 16 size blocks: 4354579 sha512's in 2.98s
Doing sha512 for 3s on 64 size blocks: 4322349 sha512's in 2.98s
Doing sha512 for 3s on 256 size blocks: 1947058 sha512's in 2.99s
Doing sha512 for 3s on 1024 size blocks: 733465 sha512's in 2.99s
Doing sha512 for 3s on 8192 size blocks: 105135 sha512's in 2.99s
OpenSSL 0.9.8zh 14 Jan 2016
built on: Oct 5 2016
options:bn(64,64) md2(int) rc4(ptr,char) des(idx,cisc,16,int) aes(partial) blowfish(idx)
compiler: -arch x86_64 -fmessage-length=0 -pipe -Wno-trigraphs -fpascal-strings -fasm-blocks -O3 -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DL_ENDIAN -DMD32_REG_T=int -DOPENSSL_NO_IDEA -DOPENSSL_PIC -DOPENSSL_THREADS -DZLIB -mmacosx-version-min=10.6
available timing options: TIMEB USE_TOD HZ=100 [sysconf value]
timing function used: getrusage
The 'numbers' are in 1000s of bytes per second processed.
type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes
sha1 45431.10k 130461.64k 274629.59k 397354.48k 464321.06k
sha256 33573.81k 79537.34k 142061.40k 174862.56k 187880.57k
sha512 23344.35k 92714.51k 166725.04k 251069.34k 287770.18k确切的数字不是这里最重要的事情,而是比率:
SHA-1块大小为20个字节,SHA-256块为32个字节,SHA-512块大小为64个字节,因此这种比较并不完全代表前两个函数在PBKDF2中所做的工作,但根据下面的数字,这并不重要。
现在,这里有一些来自我在网上找到的Hashcat基准测试结果的数字,这是一个非常强大的密码破解平台,带有8个Nvidia GTX 1080 GPU。(我刚在Google上输入了“”,并获得了第一个结果。)
Hashtype: SHA1
Speed.Dev.#1.: 8538.1 MH/s (96.95ms)
Speed.Dev.#2.: 8511.0 MH/s (97.22ms)
Speed.Dev.#3.: 8625.6 MH/s (97.79ms)
Speed.Dev.#4.: 8599.6 MH/s (96.85ms)
Speed.Dev.#5.: 8617.4 MH/s (97.89ms)
Speed.Dev.#6.: 8560.9 MH/s (97.30ms)
Speed.Dev.#7.: 8640.8 MH/s (97.61ms)
Speed.Dev.#8.: 8677.5 MH/s (97.22ms)
Speed.Dev.#*.: 68771.0 MH/s
Hashtype: SHA256
Speed.Dev.#1.: 2865.2 MH/s (96.18ms)
Speed.Dev.#2.: 2839.8 MH/s (96.65ms)
Speed.Dev.#3.: 2879.5 MH/s (97.14ms)
Speed.Dev.#4.: 2870.6 MH/s (96.32ms)
Speed.Dev.#5.: 2894.2 MH/s (96.64ms)
Speed.Dev.#6.: 2857.7 MH/s (96.78ms)
Speed.Dev.#7.: 2899.3 MH/s (96.46ms)
Speed.Dev.#8.: 2905.7 MH/s (96.26ms)
Speed.Dev.#*.: 23012.1 MH/s
Hashtype: SHA512
Speed.Dev.#1.: 1071.1 MH/s (96.43ms)
Speed.Dev.#2.: 1063.9 MH/s (96.40ms)
Speed.Dev.#3.: 1084.2 MH/s (96.25ms)
Speed.Dev.#4.: 1076.9 MH/s (96.03ms)
Speed.Dev.#5.: 1080.2 MH/s (96.64ms)
Speed.Dev.#6.: 1074.1 MH/s (96.16ms)
Speed.Dev.#7.: 1086.3 MH/s (96.01ms)
Speed.Dev.#8.: 1088.1 MH/s (95.91ms)
Speed.Dev.#*.: 8624.7 MH/s再一次,我们要关注的是比率,而不是具体的数字。在这个钻井平台上:
这证实了Pornin的回答你的链接。假设64位CPU,您应该使用SHA-512,因为相对于您花费的CPU时间,它对配备GPU的攻击者造成了最大的减速:
然而,我听说与SHA2相比,SHA1还有一些可能的缺点。其中一个可能与量子计算机有关。(是的,我知道它们还不实用,但为什么不选择更好而不是更糟呢?)
一个快速的谷歌不会给我任何有用的结果在这样的事情。我看到比特币相关的谣言讨论,专门谈论SHA-256。
另外,我想验证一下,我正确地理解了,在任何情况下,我只应该要求它提供本机输出(HMACSHA1 1为160位,HMACSHA1 2-512为512位-对吗?)对吗?
您可以请求任意数量的输出位,但对于PBKDF2,最好不要要求比底层哈希函数的输出大小更多;请参见这个答案可供参考 (并对不应该要求256位的语句进行心理编辑;该位仅适用于SHA-1)。但是请注意,对于许多应用程序来说,128位的输出很好,请参见这是一个解释问题的问答。
https://crypto.stackexchange.com/questions/54909
复制相似问题