我一直在比较多个系统之间的哈希值,并惊讶地发现 PowerShell 的哈希值与其他终端的不同。
Linux 终端(CygWin、Bash for Windows 等)和 Windows 命令提示符都显示相同的哈希值,而 PowerShell 显示不同的哈希值。
这是使用 SHA256 测试的,但在使用其他算法(如 md5)时发现了相同的问题。
编码更新:
尝试更改 PShell 编码,但对返回的哈希值没有任何影响。
[Console]::OutputEncoding.BodyName
iso-8859-1
[Console]::OutputEncoding = [Text.UTF8Encoding]::UTF8
utf-8
GitHub PowerShell 问题
https://github.com/PowerShell/PowerShell/issues/5974
最佳答案
tl;博士:
当 PowerShell 将字符串通过管道传输到外部程序时 :
$OutputEncoding
preference variable 中的字符编码对其进行编码。 因此,关键是避免 PowerShell 的管道 赞成 native shell 的,以便 防止隐式添加尾随换行符 :
sh -c "printf %s 'string' | openssl dgst -sha256 -hmac authcode"
printf %s
是 echo -n
的便携替代品.如果字符串包含 '
字符。,将它们加倍或使用 `"...`"
而是引用。cmd.exe
,事情变得更加棘手,因为 cmd.exe
不直接支持没有尾随换行符的回显:cmd /c "<NUL set /p =`"string`"| openssl dgst -sha256 -hmac authcode"
注意|
前不能有空格为了这个工作。有关此解决方案的说明和局限性,请参阅 this answer .仅当字符串包含非 ASCII 字符并且您在 Windows PowerShell 中运行时才会出现编码问题;在那个事件中,第一组
$OutputEncoding
到目标实用程序期望的编码,通常是 UTF-8:$OutputEncoding = [Text.Utf8Encoding]::new()
$OutputEncoding
中的编码进行转码。变量,在 Windows PowerShell 中默认为仅 ASCII 编码,在 PowerShell Core 中默认为 UTF-8 编码(在 Windows 和类 Unix 平台上)。echo -n
在 PowerShell 中不会产生没有尾随换行符的字符串,因此您的问题是附带的;为了完整起见,这里有一个解释:echo
是 PowerShell Write-Output
的别名cmdlet,它 - 在管道到外部程序的上下文中 - 将文本写入下一个管道段中程序的标准输入(类似于 Bash/cmd.exe 的 echo
)。 -n
被解释为 Write-Output
的(明确的)缩写的 -NoEnumerate
转变。 -NoEnumerate
仅在写入多个对象时适用,因此在此处不起作用。 echo -n "string"
与 Write-Output -NoEnumerate "string"
相同,这 - 因为只输出一个字符串 - 与 Write-Output "string"
相同,反过来,这与仅使用 "string"
相同,依赖于 PowerShell 的隐式输出行为。 Write-Output
没有选项可以取消尾随换行符,即使这样做,使用管道将其通过管道传输到外部程序也会将其添加回。关于linux - 管道文本到外部程序附加一个尾随换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48371447/