從 Windows 命令列產生字串的 SHA256 雜湊值

從 Windows 命令列產生字串的 SHA256 雜湊值

雖然這在 *nix 世界中很容易做到,但我無法想出一個解決方案來產生 SHA256 雜湊值細繩從 Windows 命令 shell(不是 PowerShell),無需安裝第 3 方應用程式或批次檔。

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"

相關內容