JS前端数据加密方案

在如今互联网火热的形势下,安全成为各互联网公司比较重视的问题。

怎么能确保用户的信息在互联网传输安全?自然会涉及到数据加密的问题。

主要会考虑3点:

  1. 数据传输过程中被劫持
  2. 客户端被植入木马,数据泄露
  3. 键盘操作事件被木马记录导致输入密码、账号等敏感数据泄露

针对问题1,使用HTTPS传输协议能解决

针对问题2,需要对客户端数据进行加密

针对问题3,在PC做模拟软键盘,通过鼠标点击事件输入密码,从而避免键盘事件被黑客监听

下面摘录知乎上的一篇回答

前端的代码都是裸露的,那么对于前端加密有没有什么意义呢?对于这个问题我也了解了其他同行的看法,很多表示前端加密意义不大。

密码在前端加密完全没有意义,对密码系统的安全性不会有任何提高,反而会引发不必要的麻烦。

首先,做前端开发的人需要知道,前端系统的控制权是完全在用户手里的,也就是说,前端做什么事情,用户有完全的控制权。

假设如同 @陈轩所说,前端做过了md5,后台就不用做了,这个做法会有什么后果?如果某一天,这个系统的数据库泄露了,黑客就直接拿到了每个用户的密码md5值,但此时,由于黑客知道密码是在前端进行哈希的,所以他不需要爆破出该md5对应的原文是什么,而是直接修改客户端向服务器发出的请求,把密码字段换成数据库中MD5就可以了,由于与数据库中记录一致,直接就会登录成功。这跟直接存储明文密码没有任何区别!!!所以不管前端是不是加密了密码,后台使用安全的哈希算法对内容再次转换是非常有必要的。(MD5可不行,要用bcrypt,我之前回答过一个类似的:随着显卡性能的高速发展,目前的快速Hash算法是否已经变得不够安全了?)

这个回答还有一个人赞同,希望大家别被错误答案误导了。

另外一个答案 @林鸿所说,在非安全HTTP连接上,可以防止原始密码被窃听。但问题在于由于你的登录系统接受的哈希过的密码,而不是原文,窃听者根本不需要原始密码,只要通过哈希结果就可以伪造请求登录系统。这样做只能防止被窃听到原文的密码被攻击者用在社会学攻击上,而不能改善该网站的安全性。所以不管前端是不是加密了密码,使用HTTPS安全连接进行登录都是非常有必要的。

以上我说的两点,合起来看就是:不管前端是否加密了密码,都不能以此为假设,让后端设计的安全等级下降,否则就会有严重的安全问题。实际上,前端进行密码加密,可以看做帮助用户多进行了一次原文的转换,不管用了什么加密算法,算出来的结果都是密码原文,你该如何保护用户的原始密码,就该如何保护此处的加密结果,因为对你的登录系统来说,它们都是密码原文。

以上这些,说明了密码加密是没有什么意义的,接下来,我要说明前端加密会带来什么问题。

有些人会认为前端进行了加密,可以降低后台的安全性需求,这种错误的观念会造成系统的安全漏洞。实际上,你不能对前端做任何的假设,所有跟安全相关的技术,都必须应用在后台上。

前端进行加密会造成页面需要js脚本才能运行,那么假设你的系统需要兼容不能运行js的客户端,就必须再设计一个使用原文的登录接口。

由于前端是不是加密,所有安全机制都必须照常应用,所以为系统增加这样的复杂性是完全没必要的,即使传输明文密码,只要正确使用了HTTPS连接和服务器端安全的哈希算法,密码系统都可以是很安全的。

作者说的是对称加密,密匙是在前端暴露固定不变的,这样势必也不是很安全的,数据传输到后端也不能直接拿来存储,需要另外再做一层加密才有可能保证数据万一被黑客盗取后的安全性。

前端与后端做到非对称加密,才是一种比较靠谱的安全方案。前端动态拿到后端的密匙,密匙有时效性,这样能保障每个用户传输的数据都是用的不同的密匙,后端拿到数据后动态解密然后按照后端的加密方法存储。

现在互联网上已经有一些开发的比较好的开源加密插件,好轮子就直接拿过来用用。

  1. braintree.js它是设计用于与客户端的库。加密库将数据(通常是在一个移动设备或merchant-hosted网站通过表单提交)和加密使用非对称密钥对的公钥提交。在服务器上,使用客户端发送加密数的公钥。

  2. BurningPig-encryption使用RSA算法进行加密

  3. MD5 顾名思义就是我们常了解的MD5加密了

  4. crypto.js 是一个综合的库,包含很多算法,MD5,SHA-1,SHA-256,AES,Rabbit,MARC4,HMAC,HMAC-MD5,HMAC-SHA1,HMAC-SHA256,PBKDF2

  5. sjcl 网上也有很多关于数据加密的,大部分思路是使用非对称加密方法,如果你有好的方法可以多多交流。

另外附上两个在node.js环境上加密解密的插件:

https://github.com/gwjjeff/cryptojs

https://github.com/cyphrd/crypto