签名是:
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..............
谢谢!
答案 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);