浏览器端无法”加密“,传统意义上的加密是为了防止数据传输的时候被监听、篡改,而不是防止用户自己修改
我们可以做到的只是让绝大多数的小白用户无法修改自己的分数,而通过插件修改一般有两种:
高手做的插件,小白用户可以使用
高手自己通过直接发请求伪造
一般加密是用js加密库函数,你可以搜下js的aes加密库,服务器传给客户端一个加密密钥并记录发送的密钥(在session中),然后浏览器用这个密钥进行加密,将加密结果传给服务器,服务器用session中的密钥进行解密后存储分数
为了让高手很难了解加密算法,可以将js代码混淆(混淆不是加密,只是让代码看着很费劲,能还原成可读性稍好些的代码,如果有人愿意花时间去研究,是可以解读的)
密钥可以通过一个算法加密传输,这样能让人”看起来“很难懂
实际上,在浏览器端做的任何处理,用户都是可以进行干扰的,因为你对分数的处理方法就写在js中,能看懂的人就知道你这个是怎么改的,使用密钥+混淆的方法能阻挡绝大部分的篡改(混淆的代码即使还原看起来也头大,一般人不愿意去分析它)
混淆的作用就是用无意义的关键字符替代原来有意义的关键字符,让浏览者“看不懂”代码,不了解代码的运行逻辑,也就无法复用。
混淆不同于加密解密,因为原来有意义的字符已经被替换了,不存在算法上的反推,任何的技术不可能再得出原来的那些有意义的字符。
所以理论上,混淆后的代码无法解密。但因为它的整个运算逻辑关系链是完整的,与混淆前的代码关系链是完全一致的,所以非要“破解”,只能说摸清它的逻辑关系链,人为去做的话,烧脑又复杂。技术上需要一定的运算能力来做这个工作,比如云计算甚至超级计算机,但即便“破解”,它也是只能分析出一个函数大致是干什么用的,原来的关键字符名称还是不可能得出。
在开头添加script,结尾添加/script
然后替换开头的eval为alert,然后保存为*.htm
最后打开制作的网页,弹出窗内的内容就是解密后的内容 ,如果你解密后复制上面代码的话,就要用火狐浏览器打开才行,IE不能复制弹出窗口的内容.
js这种东西,加啥密,还是jq写的,混淆肯定容易混出问题。
你再怎么加浏览器都要解析出来能跑才行,浏览器能跑,就意味着很好解密。
js的不可读化处理分为三个方面:压缩(compression)、混淆(obfuscation) 和加密(encryption)。
1. 压缩
这一操作的目的,是让最终代码传输量 (不代表代码量, 也不代表文件体积)尽可能小。压缩js的工具,常见的有:YUI Compressor、UglifyJS、Google Closure Compiler 等。
通常在代码压缩的过程中,只改变代码的语法,代码的语义和控制流不会有太大改变。
常见做法是把局部变量缩短化,把一些运算进行等价替换等。代码压缩对于代码保护有一些帮助,但由于语义和控制流基本没变,起不了太大作用。
在压缩层面上,代码不可读只是一种附带伤害,不是最终目的。
2. 混淆
这一操作的目的,是让代码尽可能地不可读,主要用作代码保护。
让代码不可读,增加分析的难度,这是唯一目的。混淆过后文件体积变大一倍也没关系,代码量变多也没关系,运算慢50% 也没关系。
常见的做法有:分离常量、打乱控制流、增加无义代码、检查运行环境如果不对就罢工,等等。
在混淆层面上,代码不可读是最终目的。
值得一提的是,Google Closure Compiler 的 Advance Level Compression 会压缩类和对象的成员,其压缩结果很难分析,也可以认为是一种混淆,但兼容性不太好。
3. 加密
有加密就有解密,意味着加密操作可逆,密文可以明文化。
在Web界,可以称之为加密的东西包括:HTTPS传输、JavaScript实现对称加密或者不对称加密等等。