【问题标题】:Accepted Method to Generate Salt for a password-hash function - C++为密码哈希函数生成盐的可接受方法 - C++
【发布时间】:2016-04-30 13:04:43
【问题描述】:

我正在用 C++ 编写密码管理器(仅用于教育目的!)。要生成主密钥,我的程序将运行 之前通过密码散列函数argon2输入的主密码生成主密钥。我有 1 个问题。我需要一种方法来生成用于该哈希函数的盐。根据我之前的研究(Google 搜索:“generate salt c++”和搜索 StackOverflow),我看到人们做各种类似的事情:

#include <iostream>
#include <string>
#include <cstdlib>
#include <ctime>
using namespace std;

static const char alphanum[] =
"0123456789"
"!@#$%^&*"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz";

int stringLength = sizeof(alphanum) - 1;

char genRandom()  // Random string generator function.
{

    return alphanum[rand() % stringLength];
}

int main()
{
    srand(time(0));
    for(int z=0; z < 21; z++)
    {
        cout << genRandom();

    }
    return 0;

}

我的问题是:使用 rand() 生成随机字符串是否足够,或者是否有更接受的生成盐的方法,或者可以为我做的库?

P.S 当我搜索 StackOverflow 时,我真的只能找到关于 PHP 和 C# 的文章。

【问题讨论】:

  • 我想你可能误解了我的问题。我并不怀疑 rand() 的随机性。我在问是否有更多人使用和信任的更知名的方法。 (例如加密库的某些组件)
  • 只是为了补充我的问题,我已经在 python 中成功编程,并使用 os.urandom(n) 生成盐,但是 a) python 有点太慢,b)关于 python 如何管理字符串的一些事情告诉我我不应该用它来管理密码。免责声明:这只是我的意见,我不想引发一场激烈的战争
  • 你应该怀疑rand()的随机性;太可怕了。

标签: c++ key salt password-hash


【解决方案1】:

如果你真的只需要一个 salt,即你可以用密码散列来使散列唯一的东西,那么它只需要是唯一的。特别是它不需要以任何方式随机或不可猜测。

我会将实时系统时钟与计数器连接起来。

使用系统时钟可以保证值对于我的程序的不同运行是唯一的,并且使用计数器可以保证值在我的程序的同一运行中是唯一的。

这适用于同一进程处理大量密码的服务器类型场景。如果您的程序每秒可能运行多次,或者有许多并行运行的实例,请也添加进程 ID。如果您的进程是分布式的,请包括服务器 IP 地址或 MAC。

也可以调用系统具有的任何版本的 uuidgen(),或者使用真正的加密随机数生成器。

请注意,许多实现都使用非常短的盐,即使完全没有必要保持盐的短。不要那样做,因为很难确保它们是独一无二的。

【讨论】:

  • 好的,感谢您的回答,但我有几个问题。 1)您是说 CSPRNG 会矫枉过正/不可用吗? 2) 我发誓我在很多地方读到过,使用系统时钟播种是一个真的坏主意,这不适用于这种情况吗?
  • 1) 如果需要,请随意使用 CSPRNG。 (我将其添加到答案中)。这不是必需的,但在很多环境中它很容易而且肯定会这样做。 2)随机数在密码学中有很多用途。当您需要一个随机数时,使用系统时钟播种 PRNG 是一个坏主意,因为攻击者很容易猜测系统时钟是什么。但是,盐不需要是随机的。它只需要是唯一的,所以结合系统时钟就可以了
  • @haet244cut 盐不需要是随机的。马特的意思是它必须是独一无二的。这可以防止使用相同密码的两个人的密码哈希值相同。
猜你喜欢
  • 1970-01-01
  • 2011-01-09
  • 1970-01-01
  • 2011-12-06
  • 1970-01-01
  • 2015-08-22
相关资源
最近更新 更多