我有一个Chrome扩展程序,可以使用chrome.storage
API在本地存储一些用户数据。
所以,引用文档:
不应存储机密用户信息!存储区域未加密。
无论如何,我想在存储扩展程序数据之前对其进行加密,我想知道:Google是否提供了这样做的方法?如果没有,还有其他方法吗?
答案 0 :(得分:3)
免责声明:在混淆客户端 JavaScript方面没有任何努力可以使其足够安全。像WebAssembly这样的解决方案提供更好的性能并使代码更加复杂以进行逆向工程,但显然总安全性永远不会在客户端可用,所以唯一可靠的选择是建立一个安全的服务器端
为了加密您的数据,这是一个非常有用的工具CryptoJS,它是一个很好的加密/解密算法库。我们假设您要加密一些数据,以便只能使用某个密码才能访问,那么您将执行以下操作:
var encrypted = CryptoJS.AES.encrypt("Message", "Secret Passphrase");
var decrypted = CryptoJS.AES.decrypt(encrypted, "Secret Passphrase");
小问题:看起来很明显如果您不对代码进行模糊处理(使其无法读取),任何用户都可以看到秘密密码,显然无用。
所以:如果使用常见算法和纯文本JavaScript ,编码数据不会使攻击者无法对其进行解码。因此,如果您希望使代码更安全(因为JavaScript在扩展文件夹中以纯文本形式存储,这很困难),您必须使用以下某些工具对JS函数进行加扰或混淆:
以上是使用我上面链接的工具(1次jsobfuscate和1次javascriptobfuscator)混淆的上述代码段的示例:
var _0x7390=["\x31\x20\x35\x3D\x30\x2E\x33\x2E\x37\x28\x22\x36\x22\x2C\x22\x34\x20\x32\x22\x29\x3B\x31\x20\x38\x3D\x30\x2E\x33\x2E\x39\x28\x35\x2C\x22\x34\x20\x32\x22\x29\x3B","\x7C","\x73\x70\x6C\x69\x74","\x43\x72\x79\x70\x74\x6F\x4A\x53\x7C\x76\x61\x72\x7C\x50\x61\x73\x73\x70\x68\x72\x61\x73\x65\x7C\x41\x45\x53\x7C\x53\x65\x63\x72\x65\x74\x7C\x65\x6E\x63\x72\x79\x70\x74\x65\x64\x7C\x4D\x65\x73\x73\x61\x67\x65\x7C\x65\x6E\x63\x72\x79\x70\x74\x7C\x64\x65\x63\x72\x79\x70\x74\x65\x64\x7C\x64\x65\x63\x72\x79\x70\x74","\x72\x65\x70\x6C\x61\x63\x65","","\x5C\x77\x2B","\x5C\x62","\x67"];eval(function (_0xf4e9x1,_0xf4e9x2,_0xf4e9x3,_0xf4e9x4,_0xf4e9x5,_0xf4e9x6){_0xf4e9x5=function (_0xf4e9x3){return _0xf4e9x3;} ;if(!_0x7390[5][_0x7390[4]](/^/,String)){while(_0xf4e9x3--){_0xf4e9x6[_0xf4e9x3]=_0xf4e9x4[_0xf4e9x3]||_0xf4e9x3;} ;_0xf4e9x4=[function (_0xf4e9x5){return _0xf4e9x6[_0xf4e9x5];} ];_0xf4e9x5=function (){return _0x7390[6];} ;_0xf4e9x3=1;} ;while(_0xf4e9x3--){if(_0xf4e9x4[_0xf4e9x3]){_0xf4e9x1=_0xf4e9x1[_0x7390[4]]( new RegExp(_0x7390[7]+_0xf4e9x5(_0xf4e9x3)+_0x7390[7],_0x7390[8]),_0xf4e9x4[_0xf4e9x3]);} ;} ;return _0xf4e9x1;} (_0x7390[0],10,10,_0x7390[3][_0x7390[2]](_0x7390[1]),0,{}));
很明显,这段代码无法阅读。如果您使用不同的工具多次重复混淆算法,那么即使存储在Chrome客户端的数据,您也可以减少任何人第一眼就能理解的机会扩展从来都不是完全安全的,并且使用反混淆器的任何人都可以使您的代码再次变得可读并理解。
另外一个提示:不要使用公共变量名,并将你的函数私有包装在某个对象中,这样数据将更难访问。