Windows コマンドラインから文字列の SHA256 ハッシュを生成する

Windows コマンドラインから文字列の SHA256 ハッシュを生成する

これは*nixの世界では簡単にできますが、SHA256ハッシュを生成するための解決策が思いつきません。サードパーティのアプリケーションやバッチ ファイルをインストールせずに、Windows コマンド シェル (PowerShell ではない) から実行します。

CertUtil はファイルのハッシュを生成するのには適していますが、開発者がコピー/貼り付けして他の場所で使用できるように、プレーンな文字列のハッシュが必要です。

私は、Mac と同じように動作するものを Windows でも探しています:

echo -n "foobar" | shasum -a 256

これにより、「c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2」というハッシュが生成されます。

どなたか助けていただければ幸いです。私は Mac ユーザーですが、開発者向けにドキュメントをいくつかまとめようとしています。開発者の中には Windows を使用している人もいます。

答え1

Windows バッチ/コマンド スクリプト

証明書ユーティリティパイプからの入力はサポートしていませんが、

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上記の cmd スクリプトを PowerShell で再作成することは可能です。

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"

関連情報