编程小贴士

给你的编程提供小点子


在浏览器中加密Cookie

在网络应用中,cookie是一种非常方便的存储数据的方法。正因如此,你在开发WEB应用的时候更需要注意cookie的安全性。有很多办法可以做到保证cookie的安全,这里我们再讨论一种-浏览器端的cookie加密。

对cookie的攻击

cookie是存储在客户端的,通常是一段文本。如果电脑是多人使用的,那么其他人就能够看到你的cookie信息,并且保存下来那个长期会话的ID,就可以伪造你的身份了。

Cookie经常是服务器端通过HTTP头部的’Set-Cookie’来设置,然后发送到客户端。这样就有可能被嗅探到。你可以使用 SSL/TLS来加密网络包来防止嗅探,但是很多网站,包括Facebook也只是在登录界面使用HTTPS链接,然后就会切换到HTTP链接。像 FireSheep这样的工具用来嗅探和劫持cookie是轻而易举的。

还有另外一种常见的攻击,跨站脚本攻击(XSS漏洞)当一些程序(一般是Javascript)被植入进入网页程序,然后在用户不知道的情 况下执行。当Javascript在这种环境中执行的时候,就可以读取到用户的cookie信息。这种情况是很难防御的,当用户访问他们的网站的时候,用 户完全在这网站的控制之下。你只能期望Y网站又足够的安全防御来防止XSS攻击。能完全杜绝这种攻击的办法只能是你关闭Javascript脚本执行。

浏览器端Cookie加密

CompletelyPrivateFiles.com提供了网络加密的解决方案。作为他们基础设施的一部分,他们建立了一个Javascript的API,可以对cookie进行256位的AES加密。这个API是免费的,可以在这里下载。

这个API通过分配一个随机动态的seed-key给用户或程序来产生一个强大的256位的密钥。然后在客户端通过这个密钥来加解密cookie,这是一个设计非常小巧的API,可以很容易整合进入已有的程序中。

你需要一个API账户,以便在程序中从服务器取得seed-key。在注册之后会得到一个sub-token,然后添加对应的js库就可以开始了。

然后当你需要设置安全cookie的时候,只要使用

setSecureCookie(secret, cookieName, cookieVal);

其中secret是你需要设置的密钥,可以是用户名、时间戳等等。

读取cookie的时候:

var cookieVal = getSecureCookie(secret, cookieName);

这里的secret必须和之前设置时候的secret值一样。

Cookie的安全

考虑到本文开头所说的,在每种情况下,攻击者只是为了能取到cookie的值,我们将这个值加密之后,他取到的值也就没有什么意义了。

万一有些人有访问本地资源的权限,可以扫描cookie内容,那么他看到的也只是乱码,没有什么意义。

或者说你将加密后的cookie通过表单再发送到服务器,然后服务端通过’Set-Cookie’的请求来发挥客户端设置cookie,那么在传输过程中也是加密后的内容,计算通过HTTP传输也没有安全问题。

XSS的攻击很难防御,因为攻击者对网页有完全的控制权,如果攻击不是很具体,那么可能只是读取一些内存中的变量,或者根据XSS漏洞读取你的cookie,但是想要获得有价值的cookie信息,必须先过解密者一关。

需要注意的是,加密并不能组织恶意用户损坏你的cookie值,是程序无法解密。但这并不会损坏cookie的价值。

用户隐私

除了提高安全性,你还可以通过加密的cookie来保护用户的隐私。随着越来越多的用户数据保存在云端,以及有关隐私的问题越来越突出,你或许希望保证用户的信息只能被他们自己看到。

这个问题的解决办法再用户登录之后,通过加密的cookie来存储一些敏感的信息。cookie有个过期的问题。可以通过把cookie加密后存储在服务器端,然后使用‘set-cookie’头,这样就可以了,这样甚至可以做到无限期的保存。

一个例子就是在线支付,交易是存储在网络的,但是实际的银行账户信息是通过加密的cookie来访问的。将cookie存储在服务端,然后在本地解密,银行信息就可以在程序的上下文中进行,但是也保证了用户的隐私。

总结

客户端的cookie加密对于提高网络应用的安全性是显而易见的。对于你的程序的安全性设计提供了另一个思路。他不仅仅是一个安全工具,也是一个隐私保护工具,这在现在的网络编程中是非常重要的。

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>