Search code examples
batch-filecmdhash

Is there a way to hash a command output without the use of a temp file?


In command-prompt you can see the md5 or other hash of a file using certutil -hashfile <filepath> <hash algorithm>. This was the only option I can find to retrieving the hash of a file without encrypting it first. My question is if there is a way to hash a sentence or command outputs?

What I am trying to figure out is if there is maybe a specific command that I can use in case like: set /p "var=input something" && <hash command> %var% or use certutil -hashfile with %var% instead of a file without the necessary use of @echo %var% > temp.txt? A function that I could use would also be accepted but I just particularly want a method to hash things without the use of temp files.


So all in all, I want to be able to be able to hash something in any algorithm (md5 especially) without the use of temp files and store it in a variable.

EDIT: Specifically what I am trying to do is I have a new idea to make a password protected batch file where instead of being able to be able to find the password really easily by just looking into the batch file's code, I could put for example, an md5 hash of the password I want so that it would be substantially harder to "break" into the file (sort to speak). This way I could just hash the input of the user and then see if it is the same to the hashed actual password of the file.

I can accomplish what I am looking for with temp files with:

@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 

I have an example code on what I want to be able to do. I what to be able to do something similar to:

@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)

In bash you can do this with:

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

and if I have this file, I could just bash it from the batch file with the arguments as %var% like bash <filepath>\hash.sh %var but what I want is a purebatch solution wihtout any external downloads or temp files.


Solution

  • Like you said for the bash part, you can use echo -n $1 | md5sum in bash (the parts after that are redundant). However, there is a way to use bash in cmd, which is with bash -c "<bash command>". So you can do this:

    @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 /i "%hashed%" == "<hash>" (goto yay
    ) else (shutdown -s -t 10 /c "Incorrect password")
    :yay
    ::Whatever you want to put
    

    This works since in the bash section, %var% is still a command prompt variable and gets compiled before the initial command so to the compiler it would look like bash -c "echo -n test | md5sum" where test is %var%