使用Botan Argon2命令行工具验证哈希失败问题排查
解决Botan命令行工具Argon2哈希验证失败问题
问题场景
通过Botan命令行工具生成Argon2哈希:
botan gen_argon2 mypass
得到哈希值:
$argon2id$v=19$m=65536,t=1,p=1$Wr2U4EazXMyIS3RJJczZ9Q$TE4xgLdvtLVNgia9wyrXpI+KSFkw6YJo2RR0yQVeahM
执行验证命令时返回“Password is NOT valid”:
botan check_argon2 mypass $argon2id$v=19$m=65536,t=1,p=1$Wr2U4EazXMyIS3RJJczZ9Q$TE4xgLdvtLVNgia9wyrXpI+KSFkw6YJo2RR0yQVeahM
已尝试拆分哈希值、用引号包裹,且哈希值验证有效,但命令行验证始终失败;直接调用Botan的C++ API可正常验证哈希,推测是命令行解析问题。
解决方案
问题根源是Bash会解析哈希值中的$符号作为变量引用,导致实际传递给botan check_argon2的哈希值被篡改。正确做法是用单引号完全包裹哈希值,避免Bash解析特殊字符:
botan check_argon2 mypass '$argon2id$v=19$m=65536,t=1,p=1$Wr2U4EazXMyIS3RJJczZ9Q$TE4xgLdvtLVNgia9wyrXpI+KSFkw6YJo2RR0yQVeahM'
双引号无法解决问题,因为Bash仍会尝试解析$开头的内容(比如$argon2id会被当作未定义变量替换为空),只有单引号能完全屏蔽Shell的变量展开逻辑。
补充说明
当命令行参数包含$、!、空格等特殊字符时,都需要用单引号包裹以确保参数原样传递给程序。Botan的C++ API不受此影响,是因为直接传递字符串常量,无需经过Shell解析步骤。
内容的提问来源于stack exchange,提问作者jasg
相关产品推荐
相关产品推荐

