Gere hash SHA256 de uma STRING na linha de comando do Windows

Gere hash SHA256 de uma STRING na linha de comando do Windows

Embora isso seja simples de fazer no mundo *nix, não consigo encontrar uma solução para gerar um hash SHA256 de umcordado shell de comando do Windows (não do PowerShell) sem instalar um aplicativo de terceiros ou arquivo em lote.

CertUtil funciona bem para gerar um hash de um arquivo, mas quero o hash de uma string simples para que possa ser copiado/colado para ser usado em outro lugar por alguns desenvolvedores.

Estou procurando algo no Windows que funcione assim em um Mac:

echo -n "foobar" | shasum -a 256

Isso gera um hash de "c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2".

Qualquer ajuda seria apreciada. Sou um cara do Mac e estou apenas tentando reunir alguns documentos para nossos desenvolvedores - e alguns deles usam Windows.

Responder1

Script em lote/cmd do Windows

Ocertificadonão suporta entrada de um tubo, mas apenas

certutil [options] -hashfile infile [hashalgorithm] 

Portanto, é necessário um arquivo temporário.

Este script cmd do Windows usa uma string como argumento e retorna o hash 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

Um exemplo, onde este script é nomeado sha256sum.cmd:

C:\>sha256sum.cmd
Usage: sha256sum.cmd string to be hashed

C:\>sha256sum.cmd foobar
c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2

C:\>sha256sum.cmd foo bar
fbc1a9f858ea9e177916964bd88c3d37b91a1e84412765e29950777f265c4b75

Esses são os mesmos hashes de sha256sum:

$ echo -n "foobar" | sha256sum
c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2  -
$ echo -n "foo bar" | sha256sum
fbc1a9f858ea9e177916964bd88c3d37b91a1e84412765e29950777f265c4b75  -

PowerShell

OGet-FileHashcmdletapoiafluxos de entradaque pode substituir os arquivos temporários.

Com base noexemplo 4é possível recriar o script cmd anterior no 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}

Um exemplo, onde este script é nomeado 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

Responder2

O OP solicitou uma linha única que não requer a "execução" de um arquivo em lote, então aqui está a linha única, derivada do comentário de @GeraldSchneider eesta resposta:

echo|set /p="foobar" > %TMP%/hash.txt |certutil -hashfile %TMP%/hash.txt SHA256 | findstr /v "hash"

informação relacionada