批量制作密码

时间:2014-03-09 08:50:45

标签: batch-file

我做了一个批量游戏,用户可以登录/注册。但如果站在附近的人可以偷看密码,那么密码是没有意义的。普通密码字段用星号(*)掩盖字符。

如何在批处理文件中屏蔽字符?

我之前在cmd上看过这个,但我不知道怎么做。

4 个答案:

答案 0 :(得分:13)

您可以使用XCOPY作为隐藏输入,它可以处理几乎所有字符,还可以实现退格逻辑。

@echo off
setlocal EnableDelayedExpansion
call :input
echo(
echo '!input!'
if "!input!"=="password" echo OK
exit /b

:input
for /F "tokens=1 delims=# " %%a in ('"prompt #$H# & echo on & for %%b in (1) do rem"') do (
  set "\b=%%a"
)

set "input="
:keyLoop
call :GetKey
if not defined key exit /b
if "!key!"=="!\b!" (
    if defined input (
        set "input=!input:~0,-1!"
        <nul set /p ".=!\b! !\b!"
    )
) ELSE (
    <nul set /p ".=*"
    set "input=!input!!key!"
)
goto :keyLoop


:GetKey
setlocal DisableDelayedExpansion
set "key="
for /F "usebackq delims=" %%L in (`xcopy /L /w "%~f0" "%~f0" 2^>NUL`) do (
  if not defined key set "key=%%L"
)
(
endlocal
set "key=^%key:~-1%" !
exit /b
)

此代码应该能够处理所有字符,例如^!&%<> 也可以使用退格键删除最后输入的字符。

set "key=^%key:~-1%" !似乎很奇怪,但它用于在延迟扩展上下文中使用!转义set "key=^!" !字符。
为避免所有其他字符出现问题,最后!删除了插入符号,就像在set "key=^A" !中一样,将被评估为“set”键= A“`

答案 1 :(得分:2)

好的,这与你可能想到的有点不同,但是你选择游戏开发批处理是错的。

我看到的方式是你有3个选择:

  • 使用你自己用C#,C ++,Python,[等]制作的外部程序
    • 如果这需要一个应用程序已经为您(可能存在)或您使用其中一种语言的知识
  • 使用choice命令连续输入一个键输入并等待用户命中空格以表示密码的结束
    • 然而,这限制了密码字符的选择,并使程序看起来很丑陋
  • 使用2个批处理线程,一个屏蔽和计算输入,另一个将其存储到变量。
    • 有时这可能有点眩晕,有点复杂,但可能是你唯一的选择。

现在,当我打字时,一个想法就是如何实现这个目标。由于可能需要一些时间来测试我认为我会发布这个想法(因为它似乎是这个问题的解决方案,已经存在了一段时间)。

逻辑

  • 一个批处理线程将只使用set /p将所有输入存储到变量中,完成后将通过使用waitfor或简单的目录文件与另一个批处理线程进行通信。
  • 另一个批处理线程将循环pause >nul语句,并计算pause语句循环的次数,打印出适当数量的*。该线程的另一个重要工作是感知用户何时完成输入密码的输入。

我现在开始制作这个批处理程序,但是现在我只是告诉你我的想法到目前为止。

代码

Login.bat

@echo off
Title Password Please: 

:: This is the main code
REM This code relies on Masker.bat

REM SET password to be first and thrid letter,
REM of the day of the week.
set pass=%Date:~0,1%%Date:~2,1%

REM START Masker in the same window using /b tag and create hold.pass: 
Echo 0 >%temp%\hold.pass
start /b Masker.bat "%pass%" *

REM Simply take input an leave the rest to Masker.bat
set /p pass_input=:
Echo 1 >>%temp%\hold.pass
cls

if /i "%pass%" NEQ "%pass_input%" (
Title Worng Password
Echo Wrong Password... Sorry.
Sleep 5
Exit
)

Pause > nul

REM Rest of Main game code is below or simply
:: START Main.bat & Exit

Masker.bat

@echo off
Title Password Please: 
setlocal enabledelayedexpansion

:: This is not the main code
REM This code is called upon by Login.bat (or the Main.bat game code)

REM CREATE the variables "passlen" and "mask": 
set password=%~1
set passlen=0
:miniloop
set /a passlen+=1
if "!password:~%passlen%,1!" NEQ "" goto :miniloop
set password=

set mask=%~2
if "%mask%" EQU "" set mask=*



REM MAIN loop
:loop
cls
for /l %%a in (1,1,%passlen%) do (<nul set /p=%mask%)
sleep -m 150
for /f "usebackq" %%a in ("%temp%\hold.pass") do (if "%%~a" EQU "1" Del %temp%\hold.pass & Exit)
goto :loop

它仍然需要一些改进,但是我花了30分钟就完成了它并没有成功地让它动态地告诉你输入了多少个字符。

任何人都会把这个拿走,作为我的客人。其他一切都很好

莫纳

答案 2 :(得分:0)

输入密码后无需输入即可正常工作。 如果输入正确的密码,好的。 如果您输入了错误的密码,当您输入第9个字符(可以调整)时它将停止。 它并不关心资本化。 问题:密码在代码中以纯文本形式存储

@echo off
setlocal enabledelayedexpansion
set "s= abcdefghijklmnopqrstuvwxyz"
set p=

:loop
choice /C %s%  /N >nul
set p=%p%!s:~%errorlevel%,1!&set /p =*<nul
if /i "%p%"=="secured" goto :right
if not "%p:~8,1%"=="" goto :wrong
goto :loop
goto :wrong

:right
echo you entered correct password: %p%
goto :eof

:wrong
echo you entered wrong password: %p%
goto :eof

答案 3 :(得分:0)

您可以对所有类型的格式化输入使用ReadFormattedLine子例程。例如,下面的命令读取8个字符的密码,在屏幕上显示星号,并自动继续,无需按Enter键:

call :ReadFormattedLine password="********" /M "Enter password (8 chars): "

这个子程序是用纯批处理编写的,因此它不需要任何额外的程序,它允许几个格式化的输入操作,如只读数字,将字母转换为大写等。您可以从Read a line with specific format下载ReadFormattedLine子程序