搜索
首页web前端js教程使用Javascript加密解密

使用Javascript加密解密

Nov 22, 2016 pm 01:07 PM
javascript

在创建 Opal 网站时,我们所面临的挑战,是寻找在浏览器中加密解密的可靠方法。

这篇文章描述了浏览器端加密所面临的难题,并指出了近期的科技进步所提供的一种解决方案。

在 Web 应用中加密的三种选择

只有 JavaScript 才是所有浏览器都支持的语言。与 Opal 同类的 Web 应用使用 JavaScript 编写,以便于在任何现代浏览器上运作。如果这些应用要使用加密函数,那么 JavaScript 必须能够访问到它们。

目前,要把加密函数暴露给浏览器的 JavaScript,只有三个选项:

1、使用插件加密

插件是指运行在浏览器中,可以由 JavaScript 调用的,编译过的代码。

比如,Java 和 Flash 中存在的加密库。这样的做法通常性能很高,但是需要用户安装浏览器插件程序,而这,也是人们不愿意,或者完成不了的部分(如果他们使用的是公用电脑)。

另外一个选项是使用 Chrome 浏览器的 NaCl 客户端(Native Client) 程序,它允许运行由 C 或者 C++ 编译出的机器代码。同样,这种做法的性能很高,但是NaCl客户端程序只能用于 Chrome 浏览器。

即使这些插件和NaCl客户端程序在速度上有优势,但是因为他们需要用户使用特殊插件,或者使用特定浏览器,因此这种做法的可移植性不是很好。

2、使用 Web 加密 API

即将出现的 Web 加密 API 会给 JavaScript 提供原生的基本加密接口,让 Web 应用可以更快地加密解密。但是,这项接口仍在草案阶段,主流浏览器要采用这项技术还很长的一段时间。而现在,能在多数浏览器中使用的,只有crypto.getRandomValues()函数。

在 Web 加密 API 广泛应用之前,这并不是一项切实可行的浏览器端加密方案。

3、直接用 JavaScript 加密

这种方案的优点就在于高度的可移植性。所有的浏览器都可以执行 JavaScript,也就意味着所有的浏览器都可以调用 JavaScript 写成的加密库。

在 JavaScript 中加密主要有两项缺陷:安全性和速度。我们会轮流谈到这两项缺陷。

JavaScript 加密可以变得安全

有文章声称“JavaScript 加密是有害的”,并且列出了许多证据支持这一论述。

文中的某些观点现在不再准确了。例如,这篇文章说,Math.random()函数不是随机数的良好来源,所以不可能得到足够的随机数用来加密。Math.random() 函数的确不是随机数的良好来源。在现代浏览器已经提供了 crypto.getRandomValues()函数以取得足够数量的随机数。

这个帖子中有相当多的案例证明 JavaScript 加密是个坏主意,但这种做法也它的意义。

这条回答有利地驳斥了第一个帖子中的许多观点,同时也指出了 JavaScript 加密的两个有效用例:端对端的信息加密(也就是对主机访问做出防护的应用)以及安全的远程密码认证。这些正好是 Opal 加密的使用场景,所以我们使用 JavaScript 加密是非常自然的。

JavaScript 加密可以很快

直到最近,JavaScript 在进行安全加密所要用到的复杂计算时都很慢。这直接导致了许多应用程序需要依赖于插件所提供的加密功能,这样的做法可移植性差,同时也会让用户厌烦。

幸运的是,JavaScript 近年来的性能有极大提升,所以完全使用 JavaScript 进行加密操作是可行的。现在有许多 JavaScript 加密库可供选择(链接1,链接2,链接3,链接4,链接5,链接6,链接7,链接8,链接9)。

于是就变成了选哪一个库的问题。

NaCl,一个可以信赖的 C 语言加密库

NaCl (读作 “salt”) 是一个 C 语言的库,提供对称式密钥加密解密和公钥签名认证的应用函数。它由密码学人士编写,在加密社区广为人知,受到信赖。问题之一是 NaCl 是 C 语言,而不是 JavaScript 编写的。

js-NaCl:将 NaCl 编译成 JavaScript

幸运的是,我们能把 NaCl 编译成 LLVM 的字节码,然后用 emscripten 将这些字节码编译成 JavaScript。并且,LLVM 编译器能在编译时作许多优化,所以得到的 JavaScript 代码也会得到优化。因此我们可以将 NaCl 库编译成 JavaScript,作好在浏览器中运行的准备!

js-nacl 项目正是: 编译成 JavaScript 的 NaCl 加密库。

asm.js 的速度很快!

更好的是,emscripten 编译出的代码是 JavaScript 的子集,也叫做 asm.js。你可以将 asm.js 当作很像 JavaScript 的汇编语言。浏览器遇到了 asm.js 的代码块时,会将其编译成高效的机器码,运行速度接近原生代码。

目前主要只有 Firefox 浏览器支持 asm.js 的优化。这就使 js-nacl 在 Firefox 中的加密解密非常迅速,视具体操作的不同,比 Chrome 浏览器的速度快 2 至 8 倍。但是即使是 Chrome,js-nacl 也很快,超过了我们所测试的其他所有加密库。

NaCl 这样备受信赖的加密库和现代浏览器的快速执行,使像 Opal 这样的 Web 应用都应当使用 js-nacl 库。

同样的原因下,Opal 使用了由 emscripten 编译出的 asm.js 版 scrypt 库来扩展密钥(正在这篇文章中启用)。你可以看到由项目维护者提供的 js-nacl 和 js-scrypt 性能的对比。我们同时也给 js-nacl 作了 jsperf 测试,以了解各个不同浏览器版本的性能差异,你也可以随意尝试。


声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
C和JavaScript:连接解释C和JavaScript:连接解释Apr 23, 2025 am 12:07 AM

C 和JavaScript通过WebAssembly实现互操作性。1)C 代码编译成WebAssembly模块,引入到JavaScript环境中,增强计算能力。2)在游戏开发中,C 处理物理引擎和图形渲染,JavaScript负责游戏逻辑和用户界面。

从网站到应用程序:JavaScript的不同应用从网站到应用程序:JavaScript的不同应用Apr 22, 2025 am 12:02 AM

JavaScript在网站、移动应用、桌面应用和服务器端编程中均有广泛应用。1)在网站开发中,JavaScript与HTML、CSS一起操作DOM,实现动态效果,并支持如jQuery、React等框架。2)通过ReactNative和Ionic,JavaScript用于开发跨平台移动应用。3)Electron框架使JavaScript能构建桌面应用。4)Node.js让JavaScript在服务器端运行,支持高并发请求。

Python vs. JavaScript:比较用例和应用程序Python vs. JavaScript:比较用例和应用程序Apr 21, 2025 am 12:01 AM

Python更适合数据科学和自动化,JavaScript更适合前端和全栈开发。1.Python在数据科学和机器学习中表现出色,使用NumPy、Pandas等库进行数据处理和建模。2.Python在自动化和脚本编写方面简洁高效。3.JavaScript在前端开发中不可或缺,用于构建动态网页和单页面应用。4.JavaScript通过Node.js在后端开发中发挥作用,支持全栈开发。

C/C在JavaScript口译员和编译器中的作用C/C在JavaScript口译员和编译器中的作用Apr 20, 2025 am 12:01 AM

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。 1)C 用于解析JavaScript源码并生成抽象语法树。 2)C 负责生成和执行字节码。 3)C 实现JIT编译器,在运行时优化和编译热点代码,显着提高JavaScript的执行效率。

JavaScript在行动中:现实世界中的示例和项目JavaScript在行动中:现实世界中的示例和项目Apr 19, 2025 am 12:13 AM

JavaScript在现实世界中的应用包括前端和后端开发。1)通过构建TODO列表应用展示前端应用,涉及DOM操作和事件处理。2)通过Node.js和Express构建RESTfulAPI展示后端应用。

JavaScript和Web:核心功能和用例JavaScript和Web:核心功能和用例Apr 18, 2025 am 12:19 AM

JavaScript在Web开发中的主要用途包括客户端交互、表单验证和异步通信。1)通过DOM操作实现动态内容更新和用户交互;2)在用户提交数据前进行客户端验证,提高用户体验;3)通过AJAX技术实现与服务器的无刷新通信。

了解JavaScript引擎:实施详细信息了解JavaScript引擎:实施详细信息Apr 17, 2025 am 12:05 AM

理解JavaScript引擎内部工作原理对开发者重要,因为它能帮助编写更高效的代码并理解性能瓶颈和优化策略。1)引擎的工作流程包括解析、编译和执行三个阶段;2)执行过程中,引擎会进行动态优化,如内联缓存和隐藏类;3)最佳实践包括避免全局变量、优化循环、使用const和let,以及避免过度使用闭包。

Python vs. JavaScript:学习曲线和易用性Python vs. JavaScript:学习曲线和易用性Apr 16, 2025 am 12:12 AM

Python更适合初学者,学习曲线平缓,语法简洁;JavaScript适合前端开发,学习曲线较陡,语法灵活。1.Python语法直观,适用于数据科学和后端开发。2.JavaScript灵活,广泛用于前端和服务器端编程。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)