应该如何使用openwall.com的crypt_gensalt()?

时间:2015-10-19 02:00:07

标签: c crypt blowfish

签名是:

char* crypt_gensalt(const char *prefix, unsigned long count,
    const char *input, int size)

这个电话:

char data[50] = "111111";
crypt_gensalt("$2a$10$", 10, data, sizeof(data))

产生

$2a$10$KRCvKRCv..............
  1. 应该使用什么来创建数据阵列?
  2. 用于前缀的计数是多少(因为作为整数参数传递的计数是盐中包含的内容?
  3. 使用crypt_gensalt()而不是从/ dev / urandom生成salt有什么意义?
  4. 谢谢!

1 个答案:

答案 0 :(得分:1)

1)没有什么能使用crypt_gensalt创建数据数组。为什么? crypt_gensalt返回指向传递给setting函数本身的crypt字符串的指针。如果要存储crypt_gensalt返回的值,则必须手动将返回指向的字符串复制到数据。但是有一个单独的函数,crypt_gensalt_rn将为您填充一个字符数组。有关详细信息,请参阅man 3 crypt_gensalt。手册页中的声明是:

char *crypt_gensalt_rn (const char *prefix, unsigned long count, 
                        const char *input, int size, char *output, 
                        int output_size);

允许将字符数组提供为'output'以由函数填充,而不是单独返回指针。

您不应在10中加入prefix"$2a$"是正确的(但请参阅下面"$2y$"的说明)。计数由crypt_gensalt添加,并且是它返回的setting字符串的一部分。您的input字符串应符合以下格式:

const char *input = "\$2[axy]\$[0-9]{2}\$[./A-Za-z0-9]{53}";

注意:您应该使用"$2y$"作为前缀,而不是库的1.2版本的"$2a$"。例如"版本1.2增加了对$2y$前缀(表示正确计算的哈希值)的支持以及避免与$2a$前缀"的一次正确到多次错误的哈希冲突的对策。 请参阅:Openwall Site - Modern password hashing

2)前缀中的计数是盐生成算法运行超出默认值的额外次数。 (如果设置为0,则使用默认值。

3)目的是crypt_gensalt返回指向空终止字符串的指针,该字符串被格式化为setting函数调用中的crypt

char *crypt(const char *key, const char *setting);