Java生成的SHA256哈希与OpenSSL、sha2工具不一致的原因
为什么Java生成的SHA256哈希和命令行工具结果不同?
这个问题其实挺常见的,根源在于命令行里的echo命令默认会在输出的字符串末尾自动添加一个换行符,而你Java代码里使用的是纯字符串"hello world"——没有额外的换行符,两者的输入内容本质上并不一致,哈希结果自然就有差异了。
具体验证和解释:
- 你的Java代码处理的输入是:
hello world(没有任何换行符) - 而执行
echo "hello world"时,命令行实际输出的内容是:hello world\n(末尾多了一个\n换行符,不同系统可能是\r\n,但核心是多了换行)
如何让命令行结果和Java一致?
你只需要让echo不添加换行符即可,不同shell里的写法略有不同:
- 在bash/zsh等类Unix shell中,使用
-n参数:
执行后得到的哈希值就会和Java代码生成的完全一致:echo -n "hello world" | sha2 -256 # 或者 echo -n 'hello world' | openssl dgst -sha256b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
额外提醒
如果是Windows的cmd或者PowerShell,echo的参数会不一样:
- PowerShell里可以用:
Write-Output -NoNewline "hello world" | openssl dgst -sha256 - Cmd里可以用:
set /p="hello world" <nul | openssl dgst -sha256
内容的提问来源于stack exchange,提问作者Nambi
相关产品推荐
相关产品推荐

