从 Windows 命令行生成字符串的 SHA256 哈希

从 Windows 命令行生成字符串的 SHA256 哈希

虽然这在 *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"

相关内容