
Хотя это просто сделать в мире *nix, я не могу придумать решение для генерации хеша SHA256нитьиз командной оболочки Windows (не PowerShell) без установки стороннего приложения или пакетного файла.
CertUtil отлично подходит для генерации хеша файла, но мне нужен хеш простой строки, чтобы его можно было скопировать/вставить для использования в другом месте некоторыми разработчиками.
Я ищу что-то в Windows, что работало бы так же, как это на Mac:
echo -n "foobar" | shasum -a 256
Это генерирует хэш «c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2».
Любая помощь будет оценена по достоинству. Я пользователь Mac и просто пытаюсь собрать воедино некоторые документы для наших разработчиков, а некоторые из них используют Windows.
решение1
Пакетный/cmd-скрипт Windows
Thecertutilне поддерживает ввод из трубы, а только
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 -
PowerShell
TheGet-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"