[原创]在普通HTTP上安全地传输密码
August/16th 2006
在phpx.com上原载,是我的原创
http://www.phpx.com/happy/thread-122499-1-1.html上有很多讨论


    1。理论
    在普通HTTP上,一般表单中的密码都是以明文方式传到服务器进行处理的。这无疑给了坏人以可乘之机!这里我们就说说怎么传输密码才是安全的!
    与其传输密码本身,到不如传输其加密后的形式。MD5是个不错的选择。第一,不同的资源几乎不可能生成相同的MD5摘要,第二,MD5的编码方式是不可逆推的。有了这些特性,我们就可以让MD5摘要公开的在Internet上传输,而不必担心密码被坏人知道。然后在服务端也将密码通过同样的方式加密,最后比较这两个字符串。
    然而,我们不能为了登陆而将密码md5后直接通过Internet传输,因为坏人虽然不会知道我们的密码,但肯定会知道这个特殊的字符串可以授权他们访问我们的网站!
    这就是公匙和私匙要解决的问题,首先由服务器提供一个随机字符串,然后客户端将这个随机字符串和密码相加后再加密!
    每次登陆时,服务器会产生不同的随机字符串,这样你的密码没有变,但是通过上面的方法加密后的MD5摘要却完全不同。这样就算坏人得到了这些MD5摘要,他们也不可能分析出你的密码!
    这种方法中,服务器提供的随机字符串叫做"公匙",寿命很短,并可以被任何人利用;你的密码叫做"私匙",寿命很长,而且永远也不会被人知道。
    2。实现
    客户端Javascript并没有提供现成的md5算法,但我们在 google 上用 "md5 javascript" 搜索,就可以得到很多md5在Javascript上实现的例子。
    在PHP中我就不用多说了,直接用md5()这个函数就可以搞定!随机字符串我们可以用session来存储(PHP就是强啊~~)
    3。注意
    在JS中,中文都是UTF-8格式的,所以如果你的密码是中文,而且存储在服务端的密码的编码方式是GB2312,那么两个密码加密后的字符串是完全不同的!


2686 read 4 comment(s)
#1
炎藤   2006年11月16号 14:10       回复
 每次登陆时,服务器会产生不同的随机字符串,这样你的密码没有变,但是通过上面的方法加密后的MD5摘要却完全不同。

这样的话,第一次的密码不是和第二次登入的密码完全不同了吗?
那么用户第二次登入的时候不就总失败了?

不好意思我是初学者,不知道这方面的内容
请多指教

加我MSN lwjct@hotmail.com
QQ: 44219991
#2
longbill   2006年11月16号 14:38       回复
输入的密码每次都是一样的,只是每一次在网络中传输的密码字符串不同而已,这样除非别人知道你的密码,否则不会骗过服务器的
#3
L   2008年10月26号 21:23       回复
远远谈不上安全:)
#4
liudanking   2010年01月26号 02:47       回复
虽然是你N年前写的文章了,其中的错误还是要指出来了呵
1、MD5不是加密,只是一种消息摘要算法;广义来说,一个哈希函数或者伪随机置换;
2、MD5不可逆对于“保密”其实没有什么作用,我们要crack一个MD5值不是要逆推,而是要找碰撞。王小云的工作其实也没有做到逆向推“明文”,只是找MD5碰撞的复杂度大大降低了而已。
3、公钥私钥的概念不对。
添加新的评论
称呼:*
邮件:*
网站:
内容:

Copyright © Longbill 2008-2024 , Designed by EndTo , Powered by EndCMS