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

时间:2015-03-23 14:01:15

标签: batch-file passwords timeout

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

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

2 个答案:

答案 0 :(得分:1)

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"

结果将输出

  

5f4dcc3b5aa765d61d8327deb882cf99

您现在可以硬编码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个任务。这可能会干扰你可能运行的其他类似功能 - 但是说实话。鉴于问题的基本性质,我认为可以安全地假设在这种情况下不会出现问题。

我会这样做:

@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,可以make read-host time out,但我会将其作为读者的练习。

答案 1 :(得分:0)

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

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