本方法旨在列举一些防范尝试密码攻击的方法,起到抛砖引玉的作用,希望和有识者共同探索更有效的方法,以确保用户的信息安全。
什么是尝试密码攻击?此种攻击必须拥有相应的加密软件,它是利用软件自身的运算能力达到破解的目的,也就是用不同的密码组合形式去试解以期达到破解。手工的尝试密码攻击毫无威力,因为速度实在太慢了。一般破解者会做一个接口程序,它可以自动的用大量的数据去试解加密密码或被加密文件的密码,当然目的是破解加密。
尝试密码攻击最彻底的方法是穷举密码攻击,真正的穷举攻击是不容易办到的(除非又短又简单的白痴密码),所谓穷举就是列举出所有可能的密码,用这些数据一一试解,达到破解的目的。由于人们为了方便记忆和省事常用一些好记的数字、单词、短语等作为密码,所以破解者把常用的东西建立一个库称为字典,用里面的数据去试解,这就是字典攻击。
好像尝试密码攻击是破解密码的万能钥匙。不管你的加密多么严谨,只要它存在就多一份危险,只要有高强的运算能力、和大量的时间任何加密都不在话下。不管尝试密码攻击以什么方式出现,它危害到人们的信息安全了,必须扼制。
以下仅就文件加密来说明,其它的形式可以此做参考。
1. 加密程序检测解密对象,对解密对象——被加密文件的特征进行记录例如部分文件内容的crc值,将这些保存在物理硬盘里,以便程序多次启动都可以用到,这样发现有人总是对一个文件下功夫就可以采取对策了。
2. 检测用户输入时间和次数,从输入一组密码开始到结束的时间,如果发现时间短的人都做不到,而且使用时间都差不多那可能是机器干的事,这时你要制止它。在一段时间里检验用户的输入次数,如果是尝试密码攻击次数会非常多,而正常使用即使输入错误再次输入次数也不会太多,所以发现次数过多退出运行是必要的。
3. 监视密码的组成,例如密码的数学特征。要是穷举攻击作为密码的数据是有规律的,连续攻击时用的试解码大部分内容是一样的只有一位是变化的,而字典攻击每次变化不同的字符组合,根据这些特点判断攻击的存在采取措施。
4. 现在许多加密软件为什么可以让暴力破解高效运行,多半是加密软件自身的问题。往往是这样的,软件检测密码特征符合条件的才进行解密处理,不符合的给出错误提示,这实际上是在出卖自己,给破解者一个筛选器,这个过程是很快的,所以破解者马上可以试验下一个密码。如果密码检测不符合则停滞数秒将使暴力破解的效率大大的降低,而对正常使用者没有多少影响。发现密码总是错误则退出运行也是个办法,总之不能消极的等着挨宰。
比较绝对的做法是只对密码做简单的检测就开始解密,并且不判断解密是否成功。这个工作留给破解者去做,这样解密需要时间,分析是否解密成功也需要时间,解密失败重建调入被加密文件需要时间,使得暴力破解变得很低效,终因花不起时间而放弃。正常使用者密码输入正确,将不影响使用,为了确保密码正确应该象加密时一样输入两遍密码来减少密码失误。
5. 在解密过程中,由某种条件激发弹出对话框让用户应答。但形式不能太简单了否则很容易被破解程序应付过去。
6. 尝试密码攻击容易对付的是短而简单的白痴密码,所以密码不能太短了,加密程序要限制用户密码的最小长度。但长密码不好记输入又麻烦,比较有效的办法是使用的长密码,其中大部分内容不经常更换,只有一小部分经常改变,兼用拷贝的方式以减少操作。
7. 使用特殊的密码输入方式,也是好办法,要想破解必须设计专门的破解程序。例如为用户设定私有密码,在输入密码时也要输入它。又如在输入密码的基础上,再输入字符转义定义(参见笔者关于密码转义法的文章)。
8. 输入密码的过程中让用户输入效验码(效验是否人工输入),由计算机不易识别的图形或图形文字或语音组成,尽量让用户操作简单明了,用户可用键盘、鼠标来做应答,如果正确了才可以继续执行程序,错误则退出程序。效验码也可以出现在解密过程中。为了高效运行,可以采用一键得过的方式。图形或图形文字充分利用人的视觉联想,采用歪字、随机色等使计算机不易分析成功,甚至不可能分析成功。
9. 用4.后面说的方式设计软件,只要二次加密就可以免受暴力破解的攻击。原因很简单,暴力破解的过程中将无法判断第一次解密是否成功,因为第一次解密成功了也是乱码。
10. 加密软件操作多选择性也是克服暴力破解的办法,例如设置 n种加密方法供用户选用,可以使其工作量增加n-1倍,一般使用穷举法所举的参考密码位数越多所用的时间越长,所以往往只能试解有限几位数,一下增加几倍的时间可能迫使其放弃,而软件设计增加几种加密方式太容易了,简单的修改关键参数就可以产生一种新方法。程序中还可以设置多种密码处理方式供选用,每种方式对应一种密码扩展处理,效果是一样的。
11.在穷举攻击不能涉及的函数中进行某种关于用户密码的运算。例如接收密码的输入框函数、确认密码的按钮函数等。举例说明:一般用户输入密码是一个一个字符键入的或某些部分或整体用到拷贝,而穷举攻击是一个字符串同时进入的利用这种差别,软件在接收用户密码时,每接收一个字符或一个字符串,有一个自定义变量 K,完成一种和这个字符有关的计算,例如本次输入的最后一个字符和 K完成某种计算,因为用户可能敲入一个字符或者是拷贝进来一个字符串,变量K在后面还要用到,这样因为穷举攻击的输入方式和此不一样没有此步骤所以它的 K的数值是不一样的,这样使穷举攻击的运算和正常运算不一致,也就是穷举等于做无用功,白费力气和时间。
上面列举了一些扼制尝试密码攻击的方法,认真的实施其中一种就足以对付尝试密码攻击,所以尝试密码攻击在智慧型软件面前将不再具有威慑力量。
如果窃密者修改加密软件则可能破坏上面提到的各种方法的实施,所以加密软件要有自身的鉴别机制,也就是加密软件可以检测自身的CRC值等,首次应用时记录这个数值,以后每次使用前检测,如果发现数值有变化可能软件内部被篡改了,就不要用了,找你的软件备份去吧。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)