安全设计的一个准则就是:除了你,没有人可以冒充你。
什么意思呢?就是一个安全的系统中,即使是管理员也无法知道别人的密码,甚至是系统的设计者也不能冒充别人进入,或许你是管理员,你可以任意修改别人的密码,但是由于修改密码的操作是会被记录在案的,因此你仍然无法做到神不知鬼不觉地冒充别人做坏事。
安全的设计是系统的最后一道防线,完善的一个安全系统,不是说我如何如何能够抵御别人的攻击,而是在我已经被攻陷后还如何最大限度的保护我自己。
所以我们有了各种各样的密码算法,RSA,DES,BlowFish,他们的出发点都是一个开放的算法加上一个外接的密钥。但是我发现在很多的系统中,大家都忽略了一个问题,密码以什么形式保存呢?
答案当然是加密保存了,不错,这样作为我这样的一个试图非法进入一个系统的供给者来说,确实是没有办法得到管理员的密码。但是如果简单的将密码单独加密保存的话,如果我将自己的密码的加密后的字符串更新到管理员的密码字段后,我就可以利用我的密码堂而皇之的进入到系统,而不留任何痕迹。
比如:加入我的密码是:123,加密后的字符串是 BF123FGHOO8hL258BgRR 管理员的密码加密后的字符串是HHKK55RR))99uuKK!!33 我不知道这套系统的设计算法,更无从知道所谓的密钥是多少,但是我知道BF123FGHOO8hL258BgRR 代表的是123,我只要将管理员的密码加密串也更新成BF123FGHOO8hL258BgRR 我就可以用 123 登陆了。
要解决这样的问题,则不能简单的将密码加密,最起码也要将用户名揉到密码串中统一加密,这样就没有办法使用这种方法了。
现在的社会中,密码是我们的最后一道生命线,真的希望大家在设计系统的时候,如果牵扯到密码,一定要尽可能的为用户多考虑一些。
BTW(增加一些内容):
永远不要还原用户的密码,因为现代社会中大多数人会将自己在不同场合使用的密码设置成一样的,这样就会出现你的系统中的密码其实很有可能就是该用户银行的存折密码,我以前曾经用$@#$@#方法得到过一个免费网站的用户数据库,该数据库的密码是明文保存,我尝试了80%的用户在该站点的用户密码和他们登记的邮箱的用户和密码是匹配的,所以我现在就不敢在一些不值得信任的站点使用我的最高级别的密码。