把汉字作为密码,不管是在数量上还是在记忆上都有其独到之处,但同时对于编程来说这又是令人头疼的,字符的编码本身就是编程的一个大话题,本文不在于告诉大家如何编码,而是希望大家能够把它作为一种技巧,在某些时候不妨使用一下汉字密码!
一、Windows汉字密码+有效的权限=有效克制彩虹表密码破解
在介绍之前,我们应该明白一个显而易见的道理,所有被攻击的系统都是处于联网与开机状态的,正如溢出攻击,如果存在漏洞的软件并没有常驻内存,或者系统并没有开启,那么我们也就没有目标,攻击自然也就无从谈起了。反过来再想一个问题,彩虹表攻击的前提是得到服务器的密码HASH值,我们很难防止HASH的获得,但是却能像蜜罐那样让攻击者获得一个假的HASH值,而这个HASH值我们可以靠汉字密码计算而得到,用来将攻击者引入一个误区,很多攻击者并不具备对HASH的敏感性——看到HASH能猜测出大体的密码组成元素(比如纯数字)!
要使用上面的思路,问题主要有以下两点:
1、登录时Windows不允许汉字密码
我们可以采用开机时修改系统密码为汉字密码,关机时修改系统密码为常规字符组成的密码。如果手工操作的话肯定很浪费时间,如果使用脚本或者是编写第三方应用程序,则肯定增加了密码外泄的可能,因此我们使用第二种方法,但是必须要加上相应的权限设置。
2、使用汉字密码自己的方便性问题
不管是个人电脑还是服务器,在使用汉字密码时我们并不需要担心共享时的密码输人问题,是在本机使用汉字密码启动相应的cmd.exe,我们可以在CMD中输入汉字密码来实现访问,虽然提示了拒绝访问,但并不是这种方法的问题,而是我电脑上权限设置的问题,同样在访问其它电脑时使用的密码也完全可以使用汉字密码。
实现起来就相对简单了,首先建立两个批处理文件,为了安全可以使用bat2exe之类的转换工具将bat文件转换成exe文件。
制作完成后将l.bat保存到“C:\WINDOWS\system32\GroupPolicy\Machine\Scripts\Startup”目录下,将2.bat保存到“C:\wINDOWS\system32\GroupPolicy\Machine\Scripts\Shutdown”目录下(C盘为系统盘),然后将这两个文件夹的权限都设置为只有administrator独享,单击“高级”按钮,将“从父项继承那些可以应用到子对象的权限项目”前面的勾去掉,在弹出的对话框中点击“删除”,退出后来到界面中点击“添加”,添加administrator(注意不是administrators组而只是管理员帐户),给予读取和运行权限。
最后,在“开始”一“运行”栏中输入gpedit.msc打开组策略,依次定位到“计算机配置”一“Windows设置”一“脚本(启动/关机)”,然后依次双击打开右侧的启动和关机属性,在弹出的窗口中单击“添加”按钮,选择刚才保存的批处理文件。然后依次定位到“管理模板”一“脚本”一“组策略脚本的最长等待时间”,勾选上“已启用”,将其值设置为0,这是为了保证脚本执行成功,到这里汉字密码Windows系统完成任务。
二、汉字密码WEB应用
在网上搜索了一下,发现有帖子说QQ也支持汉字密码,不过网上的方法是使用小键盘+ALT键,我在测试的时候并没有成功,其实QQ密码的安全性现在已经是相当高了,第一是密码多级设置,可以根据需要对网络交易、QQ硬盘、聊天记录进行密码设置,第二是号码异地登录对会有异常提示,第三是有较强的好友删除后恢复功能,所以对于QQ密码的安全再也不是以前一个啊拉QQ大盗就可以搞定的年代了!
虽然如此,但是在WEB登录,比如论坛用户登录的时候,使用汉字密码还是有相当强的作用的,不过大部分的论坛登录密码都是“<input type=password>”类型的输入框,所以导致了不能输入汉字密码,我们可以通过复制粘帖来实现,对于网站管理员的密码来说,这是注入攻击首当其冲要解决的问题,而一般得到的密码都为其HASH值(一般为MD5加密算法得到的),现在网上的MD5查询方法也是使用的彩虹表的破解思路,每个密码对应着一个HASH,只要比对HASH就能知道明文密码了。通过使用汉字密码可以有效的防止这种破解,大家可以随便写一个汉字去看其MD5值,然后去MD5查询站点查询比对,目前根本就没有类似的密码HASH收集,显然也就无法破解了。
当然为了使用汉字密码,在使用<input>标签时,我们可以将type指定为text,这样可以方便论坛会员输入汉字密码。如果修改为text,其密码将会以明文方式显示出来,这时可以使用ciniraputO函数实现密码的隐藏,网上有类似的内容,这里就不再赘述了。
三、汉字密码编程
C++提供了wchar_t类型以支持UNICODE编码,Windows提供了大量的针对UNICODE编码的函数,可以方便我们实现汉字密码编程,这里面最关键的实现就是汉字的输人问题,虽然char类型可以输入汉字并能很好的显示,但是在汉字比较的时候(有密码的地方一定有验证),char与wchar_t或者说扩展字符集是无法完成比较的,这时候我们可以使用MultiByteToWideCharO进行字符编码的转换然后再进行比较。同时Windows提供了两个版本的API函数,一个是UNICODE编码的,一个是ANSI编码的,如果要使用UNICODE版本则只要定义一个UNICODE的宏就可以了。
当然Windows提供的这些函数并不完美,wcslenO显然无法像strlenO那样正确得到wchar_t数组的长度,这是因为UNICODE编码是为了实现软件交互的本地化,也就是说它的主要作用是为了处理汉字常量,而并不是汉字变量,因此我们要辩证的看待汉字密码,一方面要理解其在安全中的优势,另一方面也要明白它在编程中的不足,毕竟成型的计算机并不是我们中国人制造出来的。好了,文章就写到这里,作为一种思维的扩展,希望能对大家有所帮助。