为了数据传输过程的安全,现在很多程序都把敏感数据在客户端加密后进行传输的,听说QQ空间就是对密码进行了3次MD5加密
现在有个疑问就是,这样加密后的密码发送到服务器端后服务器端也是不知道明文的,这在一定程度上保证了数据的安全,但是如果我用一个程序(如fiddler)对数据的传输进行监控,我就可以得到用户名和加密后的密码,我是不是可以用这个加密后的密码伪装成别人发送请求呢?
不知道大家对上面描述的是否清楚了,这里说个简单的例子,假如某个用户的帐号为:
userName:abc
passWord:abc
对 passWord 三次MD5加密后传输为:
userName:abc
passWord:CE272D1EE327FC6E08E283CC883782A3
我用Fiddler得到加密后的传输数据,然后,我在另外一个地方用
userName:abc
passWord:CE272D1EE327FC6E08E283CC883782A3
伪造一个请求(跳过加密过程),这个请求到达服务器后是否可以通过安全验证?
作为系统的设计者,对这种情况该如何处理?
问题的范围是保证传输安全,https就可以,他可以保证server和client之间,传输的是加密字符,因此事无法破解的
而你一直纠结于密码是明文发送,可以如fiddler的软件破解。换一个角度说,你的client已经中招了,连你键盘按过什么内容都知道,所以无论怎样md5加密密码都是不安全的。
另外md5安全一般用于签名使用的,也就是确保明文传输过程中,不会被人修改
谢谢,明白了
所以一般的客户端上,都会加上一个时间,比如现在时间是10:32分,获得这个时间的相应字符串,客户端利用时间和明文密码一起构建一个加密后的字符串。服务器端验证,当然,服务器端一定会设置一个允许的时间差。
基本思路就是这样的。
谢谢你的回复,但好像还是有些问题:
1、客户端的加密一般都是用JS加密的,加密代码都是可以分析出来的,所以我也可以用当前时间和明文密码一起构建一个加密后的字符串,从而骗过服务器的验证
2、加密一般采用的是不可逆算法(如MD5),也就是说加密后,服务器端应该是不能解密的,如果加上时间因素每次登录的 加密字符串 是不一样的,这样的话服务器端如何进行验证?
其实最关键的一个问题就是客户端的加密方式(甚至加密代码)都是可以分析出来的,而加密后的内容一般是不可逆的,有了这两个前提些就可以伪造请求
@菜鸟程序猿:
1、如果你知道了明文密码,那就可以直接登录了,和客户端本人登录无异的。我假设你只截取到了请求中已加密的字符串。当然明文密码有很多方式可以获取到,这涉及到一些社会工程学和Hook技术,必要的时候,就要采取相应逆措施。
2、服务端保存有明文密码,比如时间差是1分钟,现在是11:24,服务器端构建3个加密字符串比对下,也就是:MD5(password+1123) | MD5(password+1124) | MD5(password+1125) ,当然是有年月日的,如果你截获了的是MD5(password+1124),你是无法构建出MD5(password+1125)的。前提是你不知道明文密码。
你如果能得到用戶名和加密后的串,是可以通過的。但是 你怎麼得到呢?如果自己 搞自己的,那是容易多了哦。
用 fiddler 这样的软件监控请求就可以得到的吧
@菜鸟程序猿: 關鍵 是 這個 東西,你放到什麽地方呢?總不能運行到本機吧。
其实这个问题是有解决方案的,我想是不是可以用下面的方法:
客户端:对密码用MD5加密,把加密后的字符用能标识客户端身份的证书签名(也就是传说中的电子签名),然后传送加密后的密码和签名数据
服务端:使用客户端身份的证书公钥验证签名,签名正确表示客户端发送者正确,然后再验证密码
嗯,用这种方法应该是可以的,但现在大多数网站都没达到这一步