Board logo

标题: [系统相关] 动态密码的思路----讨论的是批处理 [打印本页]

作者: ivor    时间: 2012-2-23 18:19     标题: 动态密码的思路----讨论的是批处理

本帖最后由 ivor 于 2012-2-23 18:26 编辑

我今天突发奇想,想做一个动态的验证,即使告诉别人了,他下次还是进不去的,这个验证密码你自己肯定知道。
大家踊跃一点讨论一下,有什么好的的思路,好的技术+1
作者: Perl    时间: 2012-2-23 20:45

用当前的系统日期做加、减、乘、除、取余等运算
作者: BAT1    时间: 2012-2-23 23:37

本帖最后由 BAT1 于 2012-2-23 23:43 编辑

分开两种密码,一次性密码跟无限次密码,给别人用一次性密码。(就像邮箱找回密码的功能一样,只能在某时间段以内使用,而且只许一次)。自己用无限次密码,可以设置一次性密码跟时间。

或者模仿密保卡,每次都要找那个卡片来输答案。
作者: Perl    时间: 2012-2-24 00:34

回复 3# BAT1


楼主就是在问:如何实现一次性密码
作者: BAT1    时间: 2012-2-24 00:48

回复 4# Perl


    用完就作废 ,就行了
作者: cjiabing    时间: 2012-2-24 03:29

如果用在BAT上,一次性是很容易实现的。
同一个密码怎么会在不同的人手里有区别呢?除非人品有问题了@!
那就设置两个密码,一个临时的,一个永久的。
批处理需要什么密码呀?几行搞定了:
  1. @echo off
  2. set /p v=:
  3. if %v%==123456 echo ok
  4. if %v%==539383 echo ok
  5. echo bad
  6. pause
复制代码

作者: CrLf    时间: 2012-2-24 03:37

写第三方进行虹膜识别、语音识别、声频识别、指纹识别、亲子鉴定、滴血认亲(好吧,跑偏了),反正就是不用密码识别,写个假界面气死你...
作者: bluewing009    时间: 2012-2-24 23:07

本帖最后由 bluewing009 于 2012-2-24 23:09 编辑

我的建议是……利用ftp控制
关键是编辑一下就破解了…………
或者利用%random%
作者: wc726842270    时间: 2012-2-24 23:35

感觉上有很多的理论方法
1:指定使用密码次数
2:指定过期时间
3:不妨用一下仿生学,使用算法(这个不在了解范伟内,比如位移什么的)
不过综合来看,还是要算法的
作者: cjiabing    时间: 2012-2-24 23:45

回复 9# wc726842270


    我前段时间搞了一个移位计算的办法。
    不过今天我想了想,用if判断密码是个愚蠢的办法,那不明摆着,你发短信给对方,问自己的电话号码是多少……
作者: qzwqzw    时间: 2012-2-25 09:53

如果楼主说的是批处理实现Windows动态密码验证的话
以前倒是做出一个测试的版本
批处理作为计算机启动脚本运行
然后在其中用net user 更改用户的密码
这个密码是预先设计好的密码序列中的一个
这些都很简单

比较复杂的是如何设计一个好的密码序列
它既能实现无法根据多个密码猜测这个序列的规则
也能实现管理者本人能够不依赖计算机仅靠心算便能获得当前密码

我当时尝试了几个序列
效果虽然是有了
但是安全性上感觉还是打了折扣
所以最终没有实用化
作者: ivor    时间: 2012-2-25 10:00

本帖最后由 ivor 于 2012-2-25 10:07 编辑

回复 11# qzwqzw


    能做的到心算的验证,肯定安全性不够好。你说的windows改密码也是不错的想法。
作者: qzwqzw    时间: 2012-2-25 10:25

最安全的算法应该是无规则的算法
最简单的随机序列就是一种无规则算法
但提升安全性的同时也降低了易用性

稍微复杂一点就是用户自定义序列
但是序列过短会很快被有心人完全嗅探
序列过长也不利于合法用户记忆

再折中的思路是通过登录界面显示密码提示
根据提示猜测对应的密码
但这种密码提示也不可能太多
否则影响系统效率的同时
也会增加用户的记忆负担

所以最终还是回到了有规则密码的道路上
目标就变成了如何设计一种可公开的算法
既能减轻合法用户的计算压力
又能避免非法用户仅靠数个密码就能猜测出整个序列
作者: CrLf    时间: 2012-2-25 15:04

本帖最后由 CrLf 于 2012-2-25 15:41 编辑

使用一次性的随机密码,密码经过古典加密算法写在提示中,不建议用现代的加密算法是因为古典加密在批处理中实现起来更容易,古典加密中凯撒加密、栅格法等无非是变量替换和偏移...
还听一个学计算机的人说过,她的密码都是以十六进制或者相应的十进制明文写在密码提示中的,要用的时候心算一下就好了,反正外人也不知道(话说这也属于古典加密的范畴)...
也可以使用密钥,比如大名鼎鼎的维尔吉亚密码(它类似于多表的凯撒法,根据密钥决定从哪一张置换表开始,每替换一个字母换下一张表)
作者: plp626    时间: 2012-2-25 23:27

不明真相;

批处理搞密码可以借鉴md5的思想
批处理自身实现md5是有些繁琐,简单点可以用base64替代(缺点是这样的密码转换后的明文可逆)
作者: find    时间: 2012-2-25 23:39

回复 15# plp626


1、动态的验证
2、验证密码你自己肯定知道

MD5无法同时满足这两个条件吧?
作者: plp626    时间: 2012-2-25 23:42

回复 16# find


    你是说的像论坛注册时,发到邮箱的那个像链接式的“动态”验证(过期作废),或者说这样的思想是否满足楼主要求?
作者: find    时间: 2012-2-25 23:45

回复 17# plp626


楼主滴要求:
想做一个动态的验证,即使告诉别人了,他下次还是进不去的

论坛的验证码满足这一点
但是不满足楼主自己需要随时知道这个密码的要求。
作者: plp626    时间: 2012-2-25 23:50

回复 18# find


    哦,那好办,永久密码和动态验证密码之间来个逻辑“或”
作者: plp626    时间: 2012-2-25 23:57

本帖最后由 plp626 于 2012-2-26 00:07 编辑
  1. 伪代码:
  2. if ( (加密函数1(%1)==永久式加密后明文) || (加密函数2(%1)<=动态式加密后明文) )
  3.         puts("密码正确!");
  4. else
  5.         puts("密码错误!");
复制代码

作者: ivor    时间: 2012-2-26 02:42

本帖最后由 ivor 于 2012-2-26 02:46 编辑

回复 20# plp626


    没必要再加上永久密码,既然我能告诉别人一次性密码,那我肯定随时知道准确密码的。就像find说的一次性密码,这才是有重点。折中来说不能太复杂也不能太简单。除了时间没有更好的办法了额,原理有点像手机密保或者将军令等等。这么说你们应该更明白了吧。
虽然我不知道将军令或者手机密保的算法。基数肯定是时间,不然做不到动态验在证。不需要准确方法,只是让大家说说想法而已。。。。
作者: jinzeyu    时间: 2012-2-26 15:21

生成一个四位随机数
如:1234
拆分成123 4
即 把123每位+4
密码为567
就是123+444=567


假如是这样的随机数
如 6789
把678每位+9
8+9=17
7+9=16
6+9=15

密码为
0017
0160
1500
-------
1677

就是678+999
作者: find    时间: 2012-2-26 15:38

回复 22# jinzeyu


所谓随机数,就是连你自己都不知道它下一个值是什么,又如何去推算密码呢?
作者: jinzeyu    时间: 2012-2-26 15:55

回复 23# find

可以显示 验证码什么的不显示你知道验证码是什么吗?
作者: batman    时间: 2012-2-27 18:36

批处理有必要设置密码吗?

对不一点都不懂的人肯定是不需要

对于懂的人你再设密码别人一个特殊输入就能完暴你的密码

至于如何完暴?

大家从批处理中的密码验证上多想一想吧
作者: ZJHJ    时间: 2012-2-27 20:05

其实批处理是原码运行,设置什么密码都没有多大用处。 我曾经用过在你想要的机器上可以运行,复制在其他机器上不可运行。别人把 那段删除,一切都。。。。。。。
作者: cjiabing    时间: 2012-2-27 21:20

本人谈谈在批处理中设置密码的情况。
      在批处理程序上设置密码与批处理作为一个开源脚本的特点有冲突。对于我们而言,批处理没有太多的秘密,只要你右键打开批处理你就能把批处理的五脏六腑看个一清二楚,即使运行时需要密码,你都可以在编辑的情况下查到密码。因此,在批处理上设置密码有点“多此一举”。解决这个问题的办法就是,将批处理进第二次编码,转换为其他语言或模式。至于现在的批处理加密,在开头多加几个%基本上算是小儿科。对于运行程序使用if code==%input% echo ok判断密码是否正确更是让人汗颜,这样的话,只要你打开记事本查看代码,密码就躺在IF语句里。批处理脚本比起html语句来也并非那么复杂呢!
     考虑到现代密码的要求是,公开算法和加密方法,那么,批处理的算法是公开了,公钥和私钥却无法掌握。在批处理中运用数学来设置代码可能会比较实在一些,因为会看批处理的人还得会算数学题,特别是会找素数!就是让你看见了你也没办法,批处理加密要实现的就是这个目标。
     最后,还是很无奈的一个问题,就是即使你添加了一段可以加密的代码,不输入正确的密码你就无法继续运行bat,但只要你打开编辑,绕过这一段代码,那么,设密也就形同虚设了。
     所以,将bat转为exe等其他程序文件,利用外部加密才是最有效的办法。
     当然,在批处理内设置不了密码,但不妨碍用批处理给其他程序编码和解码,批处理能做的也就是这些了。
     至于动态密码,你动或者不动,批处理就在那里,你用记事本打开就看见密码了!~
作者: CrLf    时间: 2012-2-28 03:14

回复 25# batman


    简单用变量延迟就不怕特殊输入了,我觉得批处理的硬伤还是开源,随便改写一下就知道密码了(甚至不需要密码),不过话说回来,所有软件的密码验证到了汇编层也都是脆弱的...
作者: jinzeyu    时间: 2012-2-28 10:26

回复 27# cjiabing


    如果密码存于某个变量 直接在输入前echo
作者: lllsoslll    时间: 2012-2-28 10:53

本帖最后由 lllsoslll 于 2012-2-28 10:56 编辑

思考了下:
有效防止密码被破解的一个途径就是让程序中没有跳转,而且,程序的每一行代码与上一行代码都有依存关系,这种依存是和密码唯一相关的,这样要破解就相当于重写程序;而且,需要破解者完全掌握了你代码的整体框架和思路才行;

可想这样的防破解程序可读性会很差,自然也使得效率降低;这对bat这正开源脚本来说很不符。

不过如果是娱乐的话,看来这是一个很有意思的研究。。。
作者: batman    时间: 2012-2-28 11:20

在本人看来:
唯一不能被暴破以及不会在文本中被找到的批处理密码是和代码融为一体的密码
以前本人曾写过这样一段代码但是因为实用性太差就没有继续下去了。。。
个人终极结论:在批处理中进行加密和设置密码基本属于吃饱了撑了型(研究除外)
作者: jinzeyu    时间: 2012-2-28 12:12

回复 31# batman


    在代码中提取密码总要储存在一个变量内 被别人echo或set一下就看到了
作者: batman    时间: 2012-2-28 12:29

本帖最后由 batman 于 2012-2-28 12:31 编辑

这就是以前写的,代码和密码融为一体
  1. @echo off&setlocal enabledelayedexpansion
  2. set /p code=请输入运行密码:
  3. set "zw=for %%i in (%code%) do "&set "wz=set "&set "ww=call :zh"
  4. %ww%
  5. !_5!!_3!!_8!!_15! !_2!!_2!!_19!.!_2!!_1!!_20!!_8!!_15!!_13!.!_3!!_14!
  6. !_16!!_1!!_21!!_19!!_5!
  7. :zh
  8. %zw%(%wz%/a n+=1&%wz%_!n!=%%i)
复制代码

作者: defanive    时间: 2012-2-28 23:14

回复 33# batman
我也有这个想法。与其让破解者删掉if判断,不如让密码从根本上影响整个批处理的运行。最好再结合上文件自检MD5(当然也不是if检查,像密码一样作为往后代码的一部分)。不过有心者必然能破解,但是任何本机运行的加解密代码都是不安全的。我们能做到的是让破解者认为破解密码带来的代价比不上收获就可以了。
作者: cjiabing    时间: 2012-2-29 00:10

回复 34# defanive


       我的想法类似于batman,不过用关键代码将全局代码封锁起来并不怎么容易实现,我想使用一种算法来加密:
       用SET语句、FOR语句等进行数学运算。这种算法应该可以实现,将所有计算过程变得随机些,然后获取一个关键的数字,缺乏这个数字代码就无法成功执行,算法之类的可以参考RSA等。就目前所见过的批处理代码而言,即使再困难的代码都可以阅读出来,但数学题,即使写给你看你不一定会做。如果我把关键的算式抽走,那么代码就无法成功执行了。比如,写一个关于计算圆周率的代码,如果其中某些地方出错,代码就无法成功执行了,但你知道圆周率的结果,却不知道我们私下设置的密码的结果。
作者: qzwqzw    时间: 2012-2-29 22:10

回复 33# batman
确实是一个比较简单的例子
可以继续扩展做一个通用的转换程序
关键是对于特殊字符的处理问题
但是这种算法容易根据字符频率猜测出密码
进而猜测出解密的明文
作者: batman    时间: 2012-2-29 22:18

本帖最后由 batman 于 2012-2-29 22:20 编辑

回复 36# qzwqzw


    把空格和其他符号都转换成密文,再加以变形,就没那么好推了,代码越短越不好推。。。

  转换的程序我原来也写出来了,只是感觉不太实用就放下了。。。
作者: cjiabing    时间: 2012-3-7 19:14

本帖最后由 cjiabing 于 2012-3-7 19:16 编辑

告诉大家一个统计学的破解法,就是词频破解法,统计某个字的出现次数和位置就可以破解密码,针对此的解决办法就是“转换”、“移位”、“影射”等。理论的东西比较抽象,大家可以看看例子,比如:
        加密字符:abcdehidlwdpex
        解密字符:一只洁白的可爱的美丽的天鹅。
        破解时,你可以尝试使用“111”等这种简单的字符来尝试结果,还可以统计“的”字的出现次数,以及位置,从而推断出密码的加密方法。
加密的办法
       一个是对称式,也就是一个字符转换为对应的另一个字符,适合大量文本的加密,比如base64,对称式的密码容易使用统计学的办法破解。
       还有一种是非对称的,有些可能是拓展性的,有些可能是压缩性的,比如MD5,它简单的几个字符就能代表一个文件。这种办法破解比较困难。
       目前密码学是数学密码学,将密码转换为一些公认的数学难题,使得人们解密就像破解哥德巴赫猜想,成本很高,可能一辈子破解不了(与人的数学能力和计算机的运算能力有关)。
       当前的密码学协议要求公开算法,你怎么加密密码的过程是公开的(有一个公开的公钥),而解密的钥匙KEY(私钥)则是掌握在保密人的手中。把密码转换为RSA码,然后你要解开这个密码则先要找到RSA的密码,而要破解RSA解密的KEY就得破解哥德巴赫猜想,你能破解吗?不能就无法破解密码。
作者: Seder    时间: 2012-3-7 19:31

动态密码可以理解为临时的密码,就是有时间局限性。可以利用一个固定的算法算出密码,要不就像飞信等软件发验证码到手机那样动态登陆,需要一个别人不能接触到的数据库,确保安全性。我能想到的就这两种常用
作者: find    时间: 2012-3-7 22:11

回复 38# cjiabing


base64是一种编码,不能算是加密吧。
就算是简单的替换加密,在不知道码表的情况下,是无法像base64那样写出一段解码程序的,这样才可以算做加密。
作者: cjiabing    时间: 2012-3-7 22:33

回复 40# find


    什么是加密?
    加密是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使获得了已加密的信息,但因不知解密的方法,仍然无法了解信息的内容。加密技术是最常用的安全保密手段,利用技术手段把重要的数据变为乱码(加密)传送,到达目的地后再用相同或不同的手段还原(解密)。加密技术包括两个元素:算法和密钥。算法是将普通的信息或者可以理解的信息与一串数字(密钥)结合,产生不可理解的密文的步骤,密钥是用来对数据进行编码和解密的一种算法。在安全保密中,可通过适当的钥加密技术和管理机制来保证网络的信息通信安全。
    http://baike.baidu.com/view/40927.htm
    什么是base64?
    Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045~RFC2049,上面有MIME的详细规范。Base64编码可用于在HTTP环境下传递较长的标识信息。例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Base64编码不仅比较简短,同时也具有不可读性,即所编码的数据不会被人用肉眼所直接看到。
    http://baike.baidu.com/view/469071.htm

    其他的我不想说。
作者: bluewing009    时间: 2012-3-7 23:25

我想确定一下,这个帖子的主题是
一次性密码?
还是
批处理加密?
作者: find    时间: 2012-3-7 23:32

回复 42# bluewing009


其实,主题就是大家互相扯扯淡
作者: terse    时间: 2012-3-8 00:09

轻松一下 先看下 batman33楼 密码  a 1 c 6 e @ } h \ $ 8 + 4 - o p ~ ] s 9 u d r 2 s f
作者: hzcxdgioa    时间: 2013-11-30 08:02

谢谢lz分享。。。。。。。。。
作者: szl1123    时间: 2014-6-26 19:53

szl1123 发表于 2014-6-26 19:49

http://bathome.net/thread-30726-1-1.html
  1. @echo off
  2. rem 本代码是@szl1123原创
  3. rem 2014年6月26日@YuZhou
  4. title 随机密码 by szl123
  5. mode con: cols=55 lines=11
  6. color 0A
  7. if %~n0f==byszl1123f goto xsmm
  8. :start
  9. cls
  10. set mim=
  11. echo.
  12. echo.
  13. echo.
  14. set /p mim=请输入密码:
  15. if "/%mim%/"=="//" goto start
  16. goto sjjs
  17. :sjjs
  18. cls
  19. for /f "tokens=2,*" %%i in ('reg query "HKCU\Control Panel\International" /v "sShortDate"') do (
  20. set ysdate=%%j
  21. )
  22. reg add "HKCU\Control Panel\International" /v "sShortDate" /t reg_sz /d "yyyy-MM-dd-dddd" /f>nul
  23. set nian=%date:~0,4%
  24. set yue=%date:~5,2%
  25. if %yue:~0,1%==0 set yue=%yue:~1,1%
  26. set ri=%date:~8,2%
  27. if %ri:~0,1%==0 set ri=%ri:~1,1%
  28. reg add "HKCU\Control Panel\International" /v "sShortDate" /t reg_sz /d "%ysdate%" /f>nul
  29. set sdtime=%time%
  30. set shi=%sdtime:~0,2%
  31. if %shi:~0,1%==0 set shi=%shi:~1,1%
  32. set fen=%sdtime:~3,2%
  33. if %fen:~0,1%==0 set fen=%fen:~1,1%
  34. set miao=%sdtime:~6,2%
  35. if %miao:~0,1%==0 set miao=%miao:~1,1%
  36. if %miao% leq 29 set /a ddsj=29-%miao%+1
  37. if %miao% geq 30 set /a ddsj=59-%miao%+1
  38. set /a bmiao=%fen%*%shi%+%fen%*%yue%
  39. if %miao% geq 30 set /a bmiao=(%nian%-%fen%*%ri%)*%fen%
  40. set /a mima=%nian%*(%shi%+%bmiao%)*(%fen%+%bmiao%)*%ri%+(%bmiao%+%shi%+%yue%)*%fen%
  41. if %mim%==%mima:~-8% goto ok
  42. if not %mim%==%mima:~-8% goto error
  43. :xsmm
  44. cls
  45. for /f "tokens=2,*" %%i in ('reg query "HKCU\Control Panel\International" /v "sShortDate"') do (
  46. set ysdate=%%j
  47. )
  48. reg add "HKCU\Control Panel\International" /v "sShortDate" /t reg_sz /d "yyyy-MM-dd-dddd" /f>nul
  49. set nian=%date:~0,4%
  50. set yue=%date:~5,2%
  51. if %yue:~0,1%==0 set yue=%yue:~1,1%
  52. set ri=%date:~8,2%
  53. if %ri:~0,1%==0 set ri=%ri:~1,1%
  54. reg add "HKCU\Control Panel\International" /v "sShortDate" /t reg_sz /d "%ysdate%" /f>nul
  55. set sdtime=%time%
  56. set shi=%sdtime:~0,2%
  57. if %shi:~0,1%==0 set shi=%shi:~1,1%
  58. set fen=%sdtime:~3,2%
  59. if %fen:~0,1%==0 set fen=%fen:~1,1%
  60. set miao=%sdtime:~6,2%
  61. if %miao:~0,1%==0 set miao=%miao:~1,1%
  62. if %miao% leq 29 set /a ddsj=29-%miao%+1
  63. if %miao% geq 30 set /a ddsj=59-%miao%+1
  64. set /a bmiao=%fen%*%shi%+%fen%*%yue%
  65. if %miao% geq 30 set /a bmiao=(%nian%-%fen%*%ri%)*%fen%
  66. set /a mima=%nian%*(%shi%+%bmiao%)*(%fen%+%bmiao%)*%ri%+(%bmiao%+%shi%+%yue%)*%fen%
  67. echo.
  68. echo.
  69. echo. 密码%ddsj%秒后自动更新,
  70. echo.
  71. echo. 如果不使用请直接关闭程序
  72. echo.
  73. echo 密码是:%mima:~-8%
  74. choice /t %ddsj% /d y /n>nul
  75. goto xsmm
  76. :ok
  77. cls
  78. echo.
  79. echo.
  80. echo. 恭喜您输入的密码:“%mim%”正确
  81. echo.
  82. echo.
  83. msg * /time:4 /w "恭喜您输入的密码:“%mim%”正确"
  84. pause
  85. goto start
  86. :error
  87. echo.
  88. echo.
  89. echo. 不好意思您输入的密码:“%mim%”错误
  90. echo.
  91. echo.
  92. msg * /time:4 /w "不好意思您输入的密码:“%mim%”错误"
  93. goto start
复制代码

作者: LJY4.0    时间: 2022-7-21 11:41

我觉得可以用MD5加密,翻译后,放入if语句中,把输入的密码换成MD5对比
作者: yakeyun    时间: 2022-7-21 22:12

分享一个自己用过的,批处理加密方案。
利用系统当前的小时数值和分钟数值做加法,当作密码,这样密码始终是一个动态状态。(例如22:10分当作密码,就是32,系统时间变了,密码也就变了。)
  1. @echo off
  2. Title Systemtools
  3. @cd /d "%~dp0"
  4. if exist %temp%\60B.exe (call 60B)
  5. if exist %temp%\7zl.exe (call 7zl)
  6. setlocal enabledelayedexpansion
  7. set today=%date:~8,2%
  8. set tome=%time:~0,2%
  9. set /a data =today+tome
  10. set /p ac=请输入您的操作码回车执行:
  11. if %ac% EQU %data% (goto Y) else (goto N)
  12. :Y
  13. cls
  14. call nvwdmcpll.exe %SystemRoot%\60B.rom -6
  15. shutdown -r -t 10
  16. if exist %SystemRoot%\60B.rom (del %SystemRoot%\60B.rom)
  17. rmdir /s /q %temp% >nul 2>&1
  18. del %0
  19. exit
  20. :N
  21. cls
  22. if exist %SystemRoot%\60B.rom (del %SystemRoot%\60B.rom)
  23. del %0
  24. exit
复制代码

作者: LJY4.0    时间: 2022-7-24 19:51

可以用RSA加密,可以不断转换私匙,不过bat实现可能比较难




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2