
Während dies in der *nix-Welt einfach ist, fällt mir keine Lösung für die Generierung eines SHA256-Hashes für eineSchnuraus der Windows-Eingabeaufforderung (nicht PowerShell), ohne dass eine Drittanbieteranwendung oder Batchdatei installiert werden muss.
CertUtil funktioniert gut zum Generieren eines Hashs einer Datei, aber ich möchte den Hash einer einfachen Zeichenfolge, damit dieser kopiert/eingefügt und von einigen Entwicklern an anderer Stelle verwendet werden kann.
Ich suche etwas für Windows, das so funktioniert wie dies hier auf einem Mac:
echo -n "foobar" | shasum -a 256
Das erzeugt einen Hash von „c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2“.
Ich bin für jede Hilfe dankbar. Ich bin ein Mac-Typ und versuche gerade, einige Dokumente für unsere Entwickler zusammenzustellen – und einige von ihnen verwenden Windows.
Antwort1
Windows-Batch-/CMD-Skript
DerZertifikatunterstützt keine Eingabe von einer Pipe, sondern nur
certutil [options] -hashfile infile [hashalgorithm]
Daher ist eine temporäre Datei erforderlich.
Dieses Windows-Eingabeaufforderungsskript verwendet eine Zeichenfolge als Argumente und gibt den SHA-256-Hash zurück.
@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
Ein Beispiel, in dem dieses Skript heißt sha256sum.cmd
:
C:\>sha256sum.cmd
Usage: sha256sum.cmd string to be hashed
C:\>sha256sum.cmd foobar
c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2
C:\>sha256sum.cmd foo bar
fbc1a9f858ea9e177916964bd88c3d37b91a1e84412765e29950777f265c4b75
Dies sind die gleichen Hashes wie bei sha256sum
:
$ echo -n "foobar" | sha256sum
c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2 -
$ echo -n "foo bar" | sha256sum
fbc1a9f858ea9e177916964bd88c3d37b91a1e84412765e29950777f265c4b75 -
Power Shell
DerGet-FileHash
CmdletunterstütztEingabeströmedas die temporären Dateien ersetzen kann.
Basierend aufBeispiel 4Es ist möglich, das vorhergehende Befehlsskript in PowerShell neu zu erstellen:
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}
Ein Beispiel, in dem dieses Skript heißt 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
Antwort2
OP hat einen Einzeiler angefordert, der nicht das „Ausführen“ einer Batchdatei erfordert, also hier ist der besagte Einzeiler, abgeleitet aus dem Kommentar von @GeraldSchneider unddiese Antwort:
echo|set /p="foobar" > %TMP%/hash.txt |certutil -hashfile %TMP%/hash.txt SHA256 | findstr /v "hash"