C++ 在C&x2B中减慢SHA-256的速度+;?

C++ 在C&x2B中减慢SHA-256的速度+;?,c++,hash,cryptography,sha256,brute-force,C++,Hash,Cryptography,Sha256,Brute Force,我最近一直在学习密码学,以及慢速散列是如何最好地防止暴力攻击的。我尝试使用SHI-256在C++中实现,这是非常棒的,但是它非常快。我修改了我的一个暴力程序,搜索密码的SHA-256散列,看看我们是否找到了匹配的密码,并没有花我希望的那么长时间。目前,通过我自己制作的暴力程序(速度相对较慢),我们得到了如下表格: Password | runtime plaintext | passwords/sec plaintext | runtime SHA-256 | passwords/sec SHA

我最近一直在学习密码学,以及慢速散列是如何最好地防止暴力攻击的。我尝试使用SHI-256在C++中实现,这是非常棒的,但是它非常快。我修改了我的一个暴力程序,搜索密码的SHA-256散列,看看我们是否找到了匹配的密码,并没有花我希望的那么长时间。目前,通过我自己制作的暴力程序(速度相对较慢),我们得到了如下表格:

Password | runtime plaintext | passwords/sec plaintext | runtime SHA-256 | passwords/sec SHA-256

   zzz   |    1.18 seconds   |          149,985        |   6.2 seconds   | 28,564
显然,一个熟练的攻击者会有一个程序,以最大速度每秒猜测28000多个密码。我尝试从中使用Bcrypt,但我找不到任何关于如何在实际程序中使用它的好文档


<> P>有什么方法可以减慢我的哈希方法,或者我应该用另一种方法来对C++进行哈希吗?如果是后者,请告诉我您认为哪些资源可以帮助我-我刚开始从事密码学,知道的不多。谢谢

要减慢散列速度,请多次调用散列算法链接输出。因此,前一个散列的输出就是下一次迭代的输入。这样做,比如说5000次(测试一下速度有多慢),以生成一个较慢的散列。这依赖于没有已知的方法来缩短递归散列。使用这种方法,您可以将散列速度降低到所需的任何程度,例如在测试硬件上每秒1次散列。

散列是创建任何文本的固定长度blob的一种非常流行的方法,因为它们具有在实践中几乎始终不会导致冲突的优异特性。
SHA256
的一个常用用法是

这使得加速SHA实现对于程序员来说很有吸引力,以使他们的软件以某种方式更快地计算SHA。此外,这也使得英特尔和AMD等芯片设计师更愿意让他们的CPU计算速度更快(他们可以说,我们的芯片在TLS连接方面更快)。正因为如此,英特尔和现在的AMD建立了计算SHA。这使得事情变得非常快,因为现在操作更便宜,而且由于CPU运行周期更少,消耗更少的电力。这有助于攻击者测试如此多的SHA哈希以进行暴力强制

$ openssl speed sha256 # LibreSSL
Doing sha256 for 3s on 16 size blocks: 9747573 sha256's in 2.98s
Doing sha256 for 3s on 64 size blocks: 5266867 sha256's in 2.99s
Doing sha256 for 3s on 256 size blocks: 2241999 sha256's in 2.98s
Doing sha256 for 3s on 1024 size blocks: 684841 sha256's in 2.98s
Doing sha256 for 3s on 8192 size blocks: 90002 sha256's in 2.99s
LibreSSL 2.6.5
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
sha256           52335.96k   112735.61k   192601.26k   235327.91k   246587.42k
您可以看到,计算SHA256哈希的速度非常快。 这些基准是基于

$ sysctl -n machdep.cpu.brand_string
Intel(R) Core(TM) i7-4770HQ CPU @ 2.20GHz
clang
的选项中有一个开关
-DSHA256_ASM
,我相信它会告诉编译器使用类似这样的东西,如果有人可以详细说明的话,我不完全确定该选项。这将使SHA256计算速度更快

为了回答您的问题,您可以使用一个较慢的散列函数,例如可以根据攻击者的情况对其进行调整以使用更多的CPU或内存。
暴力强制技术可以使用CPU或GPU,这可以将哈希速率提高到每秒十亿次以上()。Scrypt可以调整为使用更大的内存量,使所有计算能力变得无用,从而阻止暴力攻击。

哈希问题是黑客的,而不是你的。他将使用最快的哈希来进行暴力。查看并搜索“密码处理”。虽然这是正确密码哈希的本质,但没有理由发明自己的方法。有很多好的密码散列算法可供选择,如bcrypt、scrypt、argon2。OP找不到特定库的文档这一事实并不是发明自己的密码的充分理由;例如,这里的建议并不是散列的种子。假设你散列了一个散列并散列了一个散列(以此类推几百次),那么攻击者是否需要复制这些步骤,或者是否可以采取快捷方式?
$ sysctl -n machdep.cpu.brand_string
Intel(R) Core(TM) i7-4770HQ CPU @ 2.20GHz