向crypt()传入含$符号的salt值时,应如何格式化处理?
关于crypt()函数含$符号salt的格式化处理问题
我正在学习Linux安全相关知识,阅读了一些关于MD5密码哈希的文章。某个演示示例使用了crypt函数,其函数原型为:
char *crypt(const char *key, const char *salt);
传入的salt值为:
const char *salt = "$1$rockyou";
其中:
$1$代表MD5算法rockyou是实际salt值
问题
若salt值包含$符号(如rock$you),传入crypt()前应如何格式化处理?
解答
首先要明确crypt()函数的salt格式规则:对于MD5类型的salt(以$1$开头),算法标识后的salt主体部分会被读取到下一个$符号为止。如果直接传入$1$rock$you,函数会错误地将rock当作salt主体,后续的$you会被忽略,无法达到预期效果。
其次,crypt()允许的salt主体字符集仅为[a-zA-Z0-9./],$并不在这个合法集合内,所以不能直接将含$的字符串作为salt主体使用。
如果一定要基于包含$的内容生成salt,正确的做法是先对原始含$的字符串进行兼容字符集编码,比如使用crypt兼容的Base64变体(仅使用a-zA-Z0-9./字符),将编码后的结果作为salt主体,再拼接成完整的salt格式。
示例(假设编码后得到合法字符集的字符串):
// 原始内容rock$you编码后得到"cm9jayR5b3U"(仅示例,需用正确编码逻辑) const char *salt = "$1$cm9jayR5b3U";
另外需要注意:crypt()的salt主体最长支持8个字符,编码后的字符串长度需控制在这个范围内,超出部分会被自动截断。
内容的提问来源于stack exchange,提问作者vengy
相关产品推荐
相关产品推荐

