如何在批处理文件中创建一个在特定时间段后超时的密码



我想让这个代码请求一个10秒后超时的密码,如果你写的密码正确,它会转到:哇,但如果不正确,它只会继续代码。(代码只是一个例子)

@ECHO OFF
TIMEOUT /t 10>nul
exit
:wow
echo now this is fun!
pause
exit

MD5sum

批处理脚本生活在纯文本文件的世界中,不太利于存储和匹配密码。毕竟,运行脚本的人可以很容易地在记事本中打开它,并看到预期的密码。这不是很粗鲁,是吗?

这些批处理密码的问题不时出现,脚本中的硬编码密码总是激怒我。那么,我们用MD5哈希来混淆密码怎么样?Windows中没有一个简单的命令可以实现这一点,但它可以通过一个(公认复杂的)PowerShell单行来实现。

将此帮助程序脚本另存为md5sum.bat:

@echo off
setlocal
if "%~1"=="" goto :EOF
powershell "[Security.Cryptography.HashAlgorithm]::Create('MD5').ComputeHash([Text.Encoding]::UTF8.GetBytes('%~1')) | %%{write-host -n $_.tostring('x2')}"

然后使用它来找到你想要的密码的MD5哈希,如下所示:

md5sum.bat "password"

结果将输出

5f4dcc3b5a765d61d8327deb882cf99

现在可以对5f4dcc3b5aa765d61d8327deb882cf99进行硬编码,而不是将密码本身硬编码到脚本中。


用户输入

现在有趣的事情来了。您也可以借用Powershell来混淆用户条目,如下所示:

@echo off
setlocal
<NUL set /P "=Password? "
set "psCommand=powershell -command "$p=read-host -AsSecureString;^
$m=[Runtime.InteropServices.Marshal];$m::PtrToStringAuto($m::SecureStringToBSTR($p))""
for /f "usebackq delims=" %%p in (`%psCommand%`) do set "pass=%%p"
setlocal enabledelayedexpansion
echo You entered !pass!
endlocal

结合这两种方法,您可以检查用户输入的密码是否与硬编码到脚本中的哈希匹配。

@echo off
setlocal
<NUL set /P "=Password? "
set "psCommand=powershell "$p=read-host -AsSecureString;^
$m=[Runtime.InteropServices.Marshal];$x=$m::PtrToStringAuto($m::SecureStringToBSTR($p));^
[Security.Cryptography.HashAlgorithm]::Create('MD5').ComputeHash([Text.Encoding]::UTF8.GetBytes($x)) ^| %%{write-host -n $_.tostring('x2')}""
for /f "usebackq delims=" %%I in (`%psCommand%`) do (
    if "%%~I"=="5f4dcc3b5aa765d61d8327deb882cf99" goto :match
)
echo Nope.
goto :EOF
:match
echo w00!

哇!现在,您可以期待password的用户输入,但用户无法通过在记事本中打开来轻松查看password是正确的密码。酷,是吗?


自毁

回到你最初的问题,如何在10秒后暂停,你必须有一点创造性。一种解决方案是在后台启动一个助手脚本,等待10秒,然后终止所有powershell.exe任务。这可能会干扰你可能正在运行的其他类似powershell的东西——但老实说。考虑到这个问题的基本性质,我认为可以肯定的是,在这种情况下,这不会是一个问题。

我会这样做:

@echo off
setlocal
if "%~1"=="helper" goto helper
start /b "" "%~f0" helper
<NUL set /P "=Password? "
set "psCommand=powershell "$p=read-host -AsSecureString;^
$m=[Runtime.InteropServices.Marshal];$x=$m::PtrToStringAuto($m::SecureStringToBSTR($p));^
[Security.Cryptography.HashAlgorithm]::Create('MD5').ComputeHash([Text.Encoding]::UTF8.GetBytes($x)) ^| %%{write-host -n $_.tostring('x2')}""
for /f "usebackq delims=" %%I in (`%psCommand%`) do (
    waitfor /s %computername% /si PasswordEntered >NUL 2>NUL
    if "%%~I"=="5f4dcc3b5aa765d61d8327deb882cf99" goto :match
)
echo Nope.
goto :EOF
:match
echo w00!
goto :EOF
:: // END MAIN RUNTIME
:helper
>NUL 2>NUL (
    title Enter password.
    waitfor PasswordEntered /t 10 || taskkill /im "powershell.exe" /f
)
exit

如果您不想使用taskkill Powershell,可以使读取主机超时,但我将把它留给读者练习。

您可以使用密码提示启动VBS文件。http://www.robvanderwoude.com/vbstech_ui_password.php

上面的链接链接到一个带有密码提示脚本的页面。您可以添加一个等待10秒然后关闭的超时。

相关内容

  • 没有找到相关文章

最新更新