Understanding is a fountain of life to those who have it, but folly brings punishment to fools. | |
Proverbs 16:22 (NIV) |
尽可能地不要编写处理密码的代码。特别是对于本地应用程序,尽量依靠普通的用户登录认证。如果应用程序为CGI脚本,则尽量依靠web服务器来提供保护。如果应用程序是在网络上的,避免用明文发送密码(如果可能的话),因为它很容易被网络窥探者俘获并在此后加以利用。使用某些算法的固定密码或使用某种掩护算法来“加密”密码从本质上来说跟用明文发送密码是一样的。
对于网络,至少要考虑使用摘要密码。摘要密码是从散列密码发展来的;一般服务器程序向客户程序发送一些数据(如日期、时间、服务器程序名称),客户程序把该数据与用户密码结合,再用散列处理该值(所谓的“摘要密码”)并把散列处理后的结果回答给服务器程序;服务器程序核实此散列值。这会起作用,因为实际上没有以任何形式发送密码;密码只是用来导出散列值。摘要密码不能被认为是通常意义上的“加密”,甚至在法律限制为了保密进行加密的国家一般也可以接受。摘要密码容易受到主动攻击的威胁,但可以抵御被动的网络窥探者。摘要密码的一个弱点在于服务器必须拥有所有未经散列处理的密码,这使得服务器成为攻击的一个非常诱人的目标。
如果应用程序必须处理密码,应该在使用后立刻重写它们以减少暴露的危险。在Java中,不要用String类型来存储密码,因为String是不可改变的(在收集内存垃圾和重用之前无法重写它们,可能会存在很长时间)。作为替代,在Java中使用char[]来保存密码,这样就可以立刻被重写。 I
如果应用程序允许用户设置密码,则检查密码并只允许“好的”密码(如不在字典中、有特定的最小长度等等)。可以参考一下如下信息 http://consult.cern.ch/writeup/security/security_3.html 以了解如何选择一个好的密码。