首页 新闻 搜索 专区 学院

一个关于客户端加密安全的小疑问?

0
悬赏园豆:30 [已解决问题] 解决于 2012-04-20 13:58

为了数据传输过程的安全,现在很多程序都把敏感数据在客户端加密后进行传输的,听说QQ空间就是对密码进行了3次MD5加密

现在有个疑问就是,这样加密后的密码发送到服务器端后服务器端也是不知道明文的,这在一定程度上保证了数据的安全,但是如果我用一个程序(如fiddler)对数据的传输进行监控,我就可以得到用户名和加密后的密码,我是不是可以用这个加密后的密码伪装成别人发送请求呢?

不知道大家对上面描述的是否清楚了,这里说个简单的例子,假如某个用户的帐号为:

userName:abc
passWord:abc

对 passWord 三次MD5加密后传输为:

userName:abc
passWord:CE272D1EE327FC6E08E283CC883782A3

我用Fiddler得到加密后的传输数据,然后,我在另外一个地方用

userName:abc
passWord:CE272D1EE327FC6E08E283CC883782A3

伪造一个请求(跳过加密过程),这个请求到达服务器后是否可以通过安全验证?

作为系统的设计者,对这种情况该如何处理?

草根程序猿的主页 草根程序猿 | 初学一级 | 园豆:129
提问于:2012-04-20 10:08
< >
分享
最佳答案
0

问题的范围是保证传输安全,https就可以,他可以保证server和client之间,传输的是加密字符,因此事无法破解的

而你一直纠结于密码是明文发送,可以如fiddler的软件破解。换一个角度说,你的client已经中招了,连你键盘按过什么内容都知道,所以无论怎样md5加密密码都是不安全的。

另外md5安全一般用于签名使用的,也就是确保明文传输过程中,不会被人修改

收获园豆:18
沉默的糕点 | 小虾三级 |园豆:1786 | 2012-04-20 13:55

谢谢,明白了

草根程序猿 | 园豆:129 (初学一级) | 2012-04-20 13:57
其他回答(3)
0

所以一般的客户端上,都会加上一个时间,比如现在时间是10:32分,获得这个时间的相应字符串,客户端利用时间和明文密码一起构建一个加密后的字符串。服务器端验证,当然,服务器端一定会设置一个允许的时间差。

基本思路就是这样的。

收获园豆:4
Sun.M | 园豆:333 (菜鸟二级) | 2012-04-20 10:33

谢谢你的回复,但好像还是有些问题:

1、客户端的加密一般都是用JS加密的,加密代码都是可以分析出来的,所以我也可以用当前时间和明文密码一起构建一个加密后的字符串,从而骗过服务器的验证

2、加密一般采用的是不可逆算法(如MD5),也就是说加密后,服务器端应该是不能解密的,如果加上时间因素每次登录的 加密字符串 是不一样的,这样的话服务器端如何进行验证?

其实最关键的一个问题就是客户端的加密方式(甚至加密代码)都是可以分析出来的,而加密后的内容一般是不可逆的,有了这两个前提些就可以伪造请求

支持(0) 反对(0) 草根程序猿 | 园豆:129 (初学一级) | 2012-04-20 10:42

@菜鸟程序猿: 

1、如果你知道了明文密码,那就可以直接登录了,和客户端本人登录无异的。我假设你只截取到了请求中已加密的字符串。当然明文密码有很多方式可以获取到,这涉及到一些社会工程学和Hook技术,必要的时候,就要采取相应逆措施。

2、服务端保存有明文密码,比如时间差是1分钟,现在是11:24,服务器端构建3个加密字符串比对下,也就是:MD5(password+1123) | MD5(password+1124) | MD5(password+1125) ,当然是有年月日的,如果你截获了的是MD5(password+1124),你是无法构建出MD5(password+1125)的。前提是你不知道明文密码。

支持(0) 反对(0) Sun.M | 园豆:333 (菜鸟二级) | 2012-04-20 11:28
0

你如果能得到用戶名和加密后的串,是可以通過的。但是 你怎麼得到呢?如果自己 搞自己的,那是容易多了哦。

收获园豆:4
無限遐想 | 园豆:3740 (老鸟四级) | 2012-04-20 11:19

用 fiddler 这样的软件监控请求就可以得到的吧

支持(0) 反对(0) 草根程序猿 | 园豆:129 (初学一级) | 2012-04-20 11:20

@菜鸟程序猿: 關鍵 是 這個 東西,你放到什麽地方呢?總不能運行到本機吧。

支持(0) 反对(0) 無限遐想 | 园豆:3740 (老鸟四级) | 2012-04-20 11:54
0

其实这个问题是有解决方案的,我想是不是可以用下面的方法:

客户端:对密码用MD5加密,把加密后的字符用能标识客户端身份的证书签名(也就是传说中的电子签名),然后传送加密后的密码和签名数据

服务端:使用客户端身份的证书公钥验证签名,签名正确表示客户端发送者正确,然后再验证密码

收获园豆:4
悠竹客 | 园豆:208 (菜鸟二级) | 2012-04-20 12:15

嗯,用这种方法应该是可以的,但现在大多数网站都没达到这一步

支持(0) 反对(0) 草根程序猿 | 园豆:129 (初学一级) | 2012-04-20 12:40
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册