虽然这在 *nix 世界中很容易做到,但我无法想出一个解决方案来生成细绳从 Windows 命令 shell(不是 PowerShell)无需安装第三方应用程序或批处理文件。
CertUtil 可以很好地生成文件的哈希值,但我想要纯字符串的哈希值,以便可以复制/粘贴以供一些开发人员在其他地方使用。
我正在寻找 Windows 中可以像在 Mac 上一样运行的东西:
echo -n "foobar" | shasum -a 256
这将生成哈希值“c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2”。
任何帮助都将不胜感激。我是一名 Mac 用户,我只是想为我们的开发人员整理一些文档 - 他们中的一些人使用 Windows。
答案1
Windows 批处理/cmd 脚本
这证书实用程序不支持管道输入,但仅支持
certutil [options] -hashfile infile [hashalgorithm]
因此需要一个临时文件。
此 Windows cmd 脚本以字符串作为参数并返回 SHA-256 哈希。
@echo off
if [%1]==[] goto usage
set STRING="%*"
set TMPFILE="%TMP%\hash-%RANDOM%.tmp"
echo | set /p=%STRING% > %TMPFILE%
certutil -hashfile %TMPFILE% SHA256 | findstr /v "hash"
del %TMPFILE%
goto :eof
:usage
echo Usage: %0 string to be hashed
例如,此脚本名为sha256sum.cmd
:
C:\>sha256sum.cmd
Usage: sha256sum.cmd string to be hashed
C:\>sha256sum.cmd foobar
c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2
C:\>sha256sum.cmd foo bar
fbc1a9f858ea9e177916964bd88c3d37b91a1e84412765e29950777f265c4b75
这些是与 相同的哈希值sha256sum
:
$ echo -n "foobar" | sha256sum
c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2 -
$ echo -n "foo bar" | sha256sum
fbc1a9f858ea9e177916964bd88c3d37b91a1e84412765e29950777f265c4b75 -
电源外壳
这Get-FileHash
命令支持输入流可以替换临时文件。
根据示例 4可以在 PowerShell 中重新创建上述 cmd 脚本:
if($args.Count -eq 0) {
Write-Host "Usage: .\$($MyInvocation.MyCommand.Name) string to be hashed";
exit 1
}
$stringAsStream = [System.IO.MemoryStream]::new()
$writer = [System.IO.StreamWriter]::new($stringAsStream)
$writer.write("$args")
$writer.Flush()
$stringAsStream.Position = 0
Get-FileHash -Algorithm SHA256 -InputStream $stringAsStream `
| Select-Object Hash `
| ForEach-Object {$_.Hash}
例如,此脚本名为sha256sum.ps1
:
PS C:\> .\sha256sum.ps1
Usage: .\sha256sum.ps1 string to be hashed
PS C:\> .\sha256sum.ps1 foobar
C3AB8FF13720E8AD9047DD39466B3C8974E592C2FA383D4A3960714CAEF0C4F2
PS C:\> .\sha256sum.ps1 foo bar
FBC1A9F858EA9E177916964BD88C3D37B91A1E84412765E29950777F265C4B75
答案2
OP 请求一个不需要“运行”批处理文件的单行程序,因此这里说的单行程序源自@GeraldSchneider 的评论和这个答案:
echo|set /p="foobar" > %TMP%/hash.txt |certutil -hashfile %TMP%/hash.txt SHA256 | findstr /v "hash"