有没有一种方法可以散列命令输出而不使用临时文件?

时间:2020-05-12 21:13:24

标签: batch-file cmd hash

在命令提示符下,您可以使用certutil -hashfile <filepath> <hash algorithm>查看md5或文件的其他哈希。这是我无需重新加密即可检索文件哈希的唯一选择。我的问题是是否可以对句子或命令输出进行哈希处理?

我要弄清楚的是,是否可能有一个特定的命令可以使用,例如:set /p "var=input something" && <hash command> %var%或将certutil -hashfile%var%一起使用,而不是一个没有必要使用@echo %var% > temp.txt吗?我可以使用的函数也将被接受,但我特别希望使用一种无​​需使用临时文件即可对事物进行哈希处理的方法。


总而言之,我希望能够在不使用临时文件的情况下,在任何算法(尤其是md5)中哈希某些内容,并将其存储在变量中。

编辑:具体来说,我有一个新想法:制作一个受密码保护的批处理文件,而不是仅仅通过查看即可真正轻松地找到密码批处理文件的代码,例如,我可以输入我想要的密码的md5哈希值,这样很难“破解”到文件中(可以说)。这样,我可以仅对用户的输入进行哈希处理,然后查看其与哈希的文件实际密码是否相同。

我可以使用以下临时文件来完成所需的工作:

@echo off
set /p var="Input the password to this file: "
@echo %var% > temp.txt
certutil -hashfile "%~dp0\temp.txt" > temp.txt
findstr /X <hash> || goto :eof 

我有一个示例代码,说明我想要做什么。我该怎么做才能做到类似于:

@echo off
set /p var="Input the password to this file: "
::certutil can be changed to the command that hashes a specific sentence
for /f "delims=" %%A in ("'certutil -hashfile "%var%"'") do set "hashed=%%A"
if %hashed% neq "<whateverhash>" (goto :eof)

在bash中,您可以执行以下操作:

#!/bin/bash
echo -n $1 | md5sum | awk '{print $1}'

如果我有这个文件,我可以从批处理文件中bash%var%一样将其bash <filepath>\hash.sh %var作为参数,但是我想要的是一个纯批处理解决方案,无需任何外部下载或临时文件。

2 个答案:

答案 0 :(得分:1)

您也可以在powershell中执行此操作:

$password = Read-Host "Enter password " -AsSecureString
$password = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($password)
$password = [Runtime.InteropServices.Marshal]::PtrToStringAuto($password)
$hashed = bash -c "echo -n $password | md5sum"
$hash = "<hash>"
$check = $hashed -eq $hash
echo $hash, $hashed
if ($check -eq "false") {shutdown -s -t 10 /c "Incorrect password"; pause}
write yay
pause

答案 1 :(得分:0)

就像您说的bash部分一样,您可以在bash中使用echo -n $1 | md5sum(此后的部分是多余的)。但是,有一种在bash -c "<bash command>"中使用cmd中的bash的方法。因此,您可以这样做:

@echo off
set /p var="Input the password to this file: "
for %%i in (bash -c "echo -n %var% | md5sum") do (set hashed=%%~i)
if "%hashed%" EQU "<hash>" (goto yay
) else (shutdown -s -t 10 /c "Incorrect password")
:yay
::Whatever you want to put

之所以可行,是因为在bash部分中,%var%仍然是命令提示符变量,并且在初始命令之前进行编译,因此对于编译器来说,它看起来像bash -c "echo -n test | md5sum",其中test是{ {1}}