Javascript AES加密[关闭]

Posted

技术标签:

【中文标题】Javascript AES加密[关闭]【英文标题】:Javascript AES encryption [closed] 【发布时间】:2010-10-22 02:00:49 【问题描述】:

是否有可用于 javascript 中的 AES 256 位加密的库?

【问题讨论】:

这是使用 crypto-js 进行 AES 加密所需的内容 还有斯坦福 Javascript Crypto Library (SJCL):crypto.stanford.edu/sjcl ***.com/questions/18279141/… developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/encrypt 【参考方案1】:

JSAES 是 JavaScript 中强大的 AES 实现。 http://point-at-infinity.org/jsaes/

【讨论】:

JSAES 在 GNU GPL 下获得许可 - 因此它不适用于某些项目。 这现在非常有用且功能丰富code.google.com/p/crypto-js @HappyDeveloper 好吧,不。不要为此责怪许可证。作者选择了错误的许可,因为 GPL 不适合库。 它是“免费使用”,但如果您想在 GPL 以外的其他条件下发布您的产品,则不能使用它。 JSAES 是一个很好的起点,但它只能用于加密 16 字节的数据。如果你想加密更大的数据块,你必须自己扩展它来实现初始化向量、加密模式(CBC或其他......)、填充。【参考方案2】:

这里是a demonstration page,它使用了slowAES。

slowAES 易于使用。逻辑设计。合理的OO包装。支持 IV 和加密模式等旋钮和控制杆。与 .NET/C# 的良好兼容性。这个名字是诙谐的;它被称为“slow AES”,因为它不是在 C++ 中实现的。但在我的测试中,它并不是非常慢。

它缺少欧洲央行模式。也缺少 CTR 模式,尽管我猜你可以很容易地在 ECB 模式下构建一个。

它只专注于加密。 available from Anandam 是一个很好的补充类,它在 Javascript 中执行 RFC2898 兼容的基于密码的密钥派生。这对库适用于类似的 .NET 类。良好的互操作性。不过,与 SlowAES 相比,Javascript PBKDF2 在生成密钥时明显比Rfc2898DeriveBytes 类慢。

从技术上讲,互操作性很好,这并不奇怪,但对我来说,关键是 SlowAES 采用的模型熟悉且易于使用。我发现其他一些用于 AES 的 Javascript 库很难理解和使用。例如,在其中一些中,我找不到设置 IV 或模式(CBC、ECB 等)的位置。事情不是我期望的那样。 SlowAES 不是这样的。这些房产正好在我预期的地方。熟悉 Java 和 .NET 加密编程模型对我来说很容易上手。

Anandam 的 PBKDF2 还没有达到那个水平。它仅支持对 DeriveBytes 函数的一次调用,因此如果您需要从密码中派生密钥和 IV,则此库将无法正常工作,不变。稍作修改,就可以正常工作。

编辑:我将包装 SlowAES 的 an example 和 Anandam 的 PBKDF2 的修改版本放在 Windows 脚本组件中。将此 AES 与密码派生密钥一起使用显示与 .NET RijndaelManaged 类的良好互操作性。

EDIT2:the demo page 展示了如何在网页中使用这种 AES 加密。使用 .NET 中支持的相同输入(iv、键、模式等)为您提供与 .NET Rijndael 类的良好互操作性。您可以执行“查看源代码”来获取该页面的 javascript。

EDIT3 后期添加:Javascript Cryptography considered harmful. 值得一读。

【讨论】:

+1 JavaScript Cryptography considered harmful 我看到一个有效的用例 - html 5 应用程序,其中所有文件都存储在本地。如果本地文件可以被劫持,那么无论如何你注定要失败;-)。 关于edit3链接,这是一篇废话……它的陈述有一半是完全错误的! 随机密钥问题可以通过让用户移动鼠标并输入密钥作为真正的随机生成器来解决。 演示页面的链接似乎已损坏。【参考方案3】:

在我搜索 AES 加密时,我从一些斯坦福大学的学生那里找到了这个。声称是最快的。支持 CCM、OCB、GCM 和块加密。 http://crypto.stanford.edu/sjcl/

【讨论】:

这就是我要说的! 缺乏文档,使用起来很困难。你如何改变密钥长度?我在文档中四处搜寻,但无法在合理的时间内弄清楚。此外,当您加密某些内容时,您会返回一组键值对,但文档似乎没有解释这些。我最终使用了可移动类型库。 这不是异步的,所以如果你正在加密或解密一些较长的字符串,例如使用 AES-CBC,那么它会阻塞 UI【参考方案4】:

Googling "JavaScript AES" 找到了几个例子。弹出的第一个旨在解释算法并提供解决方案:

Movable Type Scripts: AES

【讨论】:

我不知道如何在那个库中设置 IV。也不是很OO。 计数器模式下的 IV 等价物是 nonce。此实现已被重新制定为更加面向对象。它只包括计数器 (CTR) 操作模式。 这很好用,只是它没有任何 ECB 模式。 谷歌搜索也将这个问题显示为第二个结果。 你必须原谅我;这个答案已经有 12 年历史了,当我写它时,Stack Overflow 并没有经常出现在 Google 上。 :-)【参考方案5】:

这个帖子现在老了,不过crypto-js,可能是现在最完整的javascript加密库了。

CryptoJS 是用 JavaScript 实现的加密算法的集合。 它包括以下密码:AES-128、AES-192、AES-256、DES、Triple DES、Rabbit、RC4、RC4Drop 和散列器:MD5、RIPEMD-160、SHA-1、SHA-256、SHA-512、SHA -3 具有 224、256、384 或 512 位。

您可能想查看他们的Quick-start Guide,这也是以下 node.js 端口的参考。

node-cryptojs-aes 是 crypto-js 的 node.js 端口

【讨论】:

遗憾的是缺少文档。它似乎只有一个“快速入门”指南。完整的文档在哪里?它说它支持多种密钥长度,但没有关于如何做到这一点的文档。 @CpnCrunch : 完整的 API 文档不在线,但作为完整的 javadoc api cmets 的代码。你可以生成它。阅读 cipher-core.js source 上的 cmets,您会发现密码的密钥大小和密码的 IV 大小。 奇怪,当我加密解密回来时,文本不同 因为使用openssl存在一些冲突【参考方案6】:

最近我需要在javascript和python之间执行一些加密/解密互操作性。

具体来说……

1) 使用 AES 在 javascript 中加密和在 python 中解密 (Google App Engine) 2)使用RSA在javascript中加密并在python中解密(Google App Engine) 3)使用pycrypto

我发现网上有很多不同版本的 RSA 和 AES,并且 它们的方法各不相同,但我没有找到端到端 javascript 和 python 互操作性的好例子。

经过多次反复试验,最终我设法拼凑出适合我需要的东西。

无论如何,我找到了一个 js/webapp 与使用 AES 以及公钥和私钥 RSA 的 google 应用引擎托管的 python 服务器对话的示例。

虽然我会通过链接将其包含在此处,以防它对需要完成相同任务的其他人有所帮助。

http://www.ipowow.com/files/aesrsademo.tar.gz

并在 rsa-aes-demo DOT appspot DOT com 上查看 demo

编辑:查看浏览器控制台输出并查看源代码以获取有关演示

中正在发生的事情的一些提示和有用消息

编辑:将非常旧且失效的源链接更新为现在指向

https://sestertii.com/files/aesrsademo.tar.gz

【讨论】:

非常感谢您!我一辈子都无法让我的 javascript aes 与我的 python aes 对话。 我整晚都在尝试(使用 pycrypto 和其他人)来完成您的代码帮助我在 10 分钟内完成的工作。非常感谢! 无论出于何种原因,我都能轻松地让 RSA 工作,但 AES 却是一件非常痛苦的事情。谢谢你!!! 链接...未找到!【参考方案7】:

从我自己的经验来看,asmcrypto.js 在 JavaScript 中提供了最快的 AES 实现(尤其是在 Firefox 中,因为它可以在那里充分利用 asm.js)。

来自自述文件:

Chrome/31.0
SHA256: 51 MiB/s (9 times faster than SJCL and CryptoJS)
AES-CBC: 47 MiB/s (13 times faster than CryptoJS and 20 times faster than SJCL)

Firefox/26.0
SHA256: 144 MiB/s (5 times faster than CryptoJS and 20 times faster than SJCL)
AES-CBC: 81 MiB/s (3 times faster than CryptoJS and 8 times faster than SJCL)

编辑:Web Cryptography API 现在是implemented in most browsers,如果您关心性能,应该将其用作主要解决方案。请注意,IE11 实现了该标准的早期草案版本,它没有使用 Promise。

一些例子可以在这里找到:

Web Cryptography API Examples on GitHub Deriving Keys from Passwords with WebCrypto

【讨论】:

我使用 CryptoJS 获得了大约 8 MiB/s。想知道这将如何执行。【参考方案8】:

使用 CryptoJS

代码如下: https://github.com/odedhb/AES-encrypt

这是一个在线工作示例: https://odedhb.github.io/AES-encrypt/

【讨论】:

最佳答案【参考方案9】:

试试asmcrypto.js——真的很快。

PS:我是作者,如果有问题,我可以回答您。 我也很高兴得到一些反馈:)

【讨论】:

asmcrypto.js 很好,但在 IE10 上效果不佳。它有时会挂起浏览器超过 1 分钟,或至少 45 秒。另外,我不明白,为什么需要替换全局数学函数?有很多图书馆都在使用这个。 您能否评论一下您如何确定它工作正常? IOW:你怎么知道你正确地实施了 AES? IE10 性能很差,因为它根本没有优化 asm.js。它也有一些不同的 JIT 模式。使代码在 IE 中运行良好也使其在 Chrome 和 FF 中很糟糕。假设我有正确的选择。关于 Math.random 有一个很长的discussion。简而言之,这需要防止原始 Math.random 输出泄漏(理论上可能会降低 PRNG 安全性)。【参考方案10】:

还有一个斯坦福免费库作为 Cryptojs 的替代品

http://crypto.stanford.edu/sjcl/

【讨论】:

【参考方案11】:

如果您尝试使用 javascript 来避免使用 SSL,请三思。有许多中途措施,但只有 SSL 提供安全通信。 Javascript 加密库可以帮助抵御某些攻击,但不是真正的中间人攻击。

以下文章解释了如何尝试使用 javascript 创建安全通信,以及如何出错: Use JavaScript encryption module instead of SSL/HTTPS

注意:如果您正在为自定义域上的谷歌应用引擎寻找 SSL,请查看wwwizer.com。

【讨论】:

不知道为什么这被否决了,因为这是一个非常好的观点,任何想要实现 javascript 加密的人至少需要考虑一下。赞成。 使用客户端加密来避免 SSL 是一个古老的观点,有人说它反对它:实际上它可以增加 HTTPS 的安全性,避免被动攻击,或用于下载的应用程序和浏览器扩展.我只是看到它曾经被错误地使用(我的大学,但他们已经修复了它)并且多次正确使用(例如cryptocat)。【参考方案12】:

http://www.movable-type.co.uk/scripts/aes.html 库可能会有所帮助。

【讨论】:

【参考方案13】:

另一种支持 AES-256 的解决方案:https://github.com/digitalbazaar/forge

【讨论】:

【参考方案14】:

这是唯一对我有用的解决方案:

http://www.hanewin.net/encrypt/aes/aes.htm

它非常基本,但使用起来很简单,而且看起来效果很好。

【讨论】:

你实际上是如何调用加密和解密函数的? hanewin.net/encrypt/aes/aes-test.htm

以上是关于Javascript AES加密[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript前端和Java后端的AES加密和解密

如何使用Javascript中的AES CBC零填充进行加密并使用Java进行解密

AES加密算法

javascript 与 PHP 通信加密,使用AES 128 CBC no padding,以及ios,java,c#文章例子

SHA 和 AES 加密有啥区别? [关闭]

AES地址栏传参加密