11.1. 密码

如果可能,请不要编写代码来处理密码。 特别是,如果应用程序是本地的,请尝试依赖用户的正常登录身份验证。 如果应用程序是 CGI 脚本,请尝试尽可能地依赖 Web 服务器来提供保护 - 但请参阅下文关于在 Web 服务器中处理身份验证的内容。 如果应用程序通过网络传输,请避免以明文形式发送密码(如果可能),因为它很容易被网络嗅探器捕获并在以后重用。 使用算法中固定的密钥或使用某种掩蔽算法“加密”密码本质上与以明文形式发送密码相同。

对于网络,至少考虑使用摘要密码。 摘要密码是使用哈希值开发的密码; 通常,服务器会向客户端发送一些数据(例如,日期、时间、服务器名称),客户端将此数据与用户密码组合,客户端对该值进行哈希处理(称为“摘要密码”),然后仅将哈希结果回复给服务器; 服务器验证此哈希值。 这种方法有效,因为密码实际上从未以任何形式发送; 密码仅用于导出哈希值。 摘要密码在通常意义上不被认为是“加密”,即使在一些国家/地区,其法律限制了为保密而进行的加密,摘要密码通常也被接受。 摘要密码容易受到主动攻击威胁,但可以防止被动网络嗅探器。 一个弱点是,为了使摘要密码工作,服务器必须拥有所有未哈希处理的密码,这使得服务器成为非常有吸引力的攻击目标。

如果您的应用程序允许用户设置密码,请检查密码并仅允许“好”密码(例如,不在字典中,具有一定的最小长度等)。 您可能需要查看诸如 http://consult.cern.ch/writeup/security/security_3.html 之类的信息,了解如何选择一个好的密码。 如果可以,您应该使用 PAM,因为它支持可插拔的密码检查器。