You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 03:35:03