是否有像 PHP 一样进行 Rijndael 256 位加密的 JavaScript 库?
Posted
技术标签:
【中文标题】是否有像 PHP 一样进行 Rijndael 256 位加密的 JavaScript 库?【英文标题】:Is there a JavaScript library that does Rijndael 256bit encryption like PHP? 【发布时间】:2012-04-21 10:26:16 【问题描述】:我一直在 php 中为我的 API 广泛使用 Rijndael 256 位加密,并希望将它用于我的用 javascript 编写的 API 包装器,但我一直无法找到获得相同结果的解决方案和 PHP 一样。
PHP 是什么意思:
base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256,$password,$secretInformation,MCRYPT_MODE_CBC,$iv));
和
base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256,$password,$secretInformation,MCRYPT_MODE_EBC));
.. 以及解密变体。
我知道许多 256 位 AES 库没有得到与 PHP 使用 Rijndael 256 位加密相同的结果,因此我想知道是否有一个库能够完成上述示例中 PHP 所做的事情?
谢谢!
【问题讨论】:
这会将您的密码暴露给用户,使加密不是很有用... 你为什么要发布这样一个脾气暴躁的链接?这不是主题。 @GGG 没关系,密码无论如何都会“暴露”(即使您的 Facebook 登录信息也会暴露,即使您使用 HTTPS,如果侦听器可以访问您的计算机)。这个想法是使 JavaScript 可以通过首先共享密钥然后在会话打开时使用该密钥解锁数据来处理加密数据。我可以通过向服务器发出请求然后让服务器通过 PHP 与目标服务器通信来做到这一点,但这比直接请求要慢得多。当服务器上除了密钥之外没有任何会话数据存储时,这也很有用。 @kristovaher 也许我误解了你,但我看不出密码在纯 PHP 解决方案中是如何暴露的。但是,是的,如果您在每个会话中更改密码或初始化向量,应该没问题... 纯 PHP 显然是更好的解决方案,但我也需要牢记性能。如果我让浏览器联系服务器 A 联系服务器 B 将数据返回给服务器 A 再将数据返回给浏览器,而不是让浏览器直接与服务器 B 通信,则需要两倍的请求。但显然,似乎真的没有一个用于 JavaScript 的 Rijndael 256 位加密库可以像 PHP 那样做,所以我想我要么尝试编写它,要么放手 :) 【参考方案1】:MCRYPT_RIJNDAEL_256 不是具有 256 位密钥的 AES,它基本上是具有 256 位块大小的“AES”(AES 通常具有 128 位块大小)。 Rinjdael 有很多选项,并通过将这些选项减少到仅 128 或 256 位密钥大小而标准化为 AES。因此,库必须支持标准(AES)而不是原型。
如果您想要 AES 256 或 128 (几乎所有库都实际支持),请使用 MCRYPT_RIJNDAEL_128 和 128 位或 256 位密钥。块大小的差异对安全性并没有太大影响。
另外,使用原始密码作为密钥是一个非常糟糕的主意。您可以使用基于密码的密钥派生函数(如 PBKDF2)从密码中获取密钥。
【讨论】:
昨晚我刚刚检查了这个问题是否有答案,但没有找到答案,你能相信吗?至于密码,为什么这是个坏主意?它需要是一个随机字符串,对吗?那么为什么 md5() 用盐对密码进行散列是一个坏主意呢? 我会接受这个作为答案,因为它可以让我更好地理解手头的问题,尽管我并没有真正寻找解决方案。 本来我以为你只是输入密码。但是,md5 不是最好的主意,要么 md5() 为您提供随机字符串,但 md5、sha1、sha512 等是计算速度非常快的函数。如果您的用户使用一些常见的密码,它真的很容易,只需测试大量猜测(您可以在 GPU 上每秒进行 23 亿次 sha1 和)。因此,相反,您使用的东西很慢,不会慢到足以减慢程序的速度,但速度足以减慢那些只是在他们获得的加密数据副本上离线猜测密码的人的速度。因此使用 PBKDF2 我认为你在这里有点矫枉过正。首先,我说 MD5 是从同样加盐的密码生成的,所以这已经禁用了你所暗示的大部分内容。我们不要忘记 IV 也是完全由计算机生成的,并且仅对这两个系统已知,因此试图闯入的人也必须知道 IV。 (当然 IV 不用于 EBC 模式,这就是加盐密码派上用场的地方)。以上是关于是否有像 PHP 一样进行 Rijndael 256 位加密的 JavaScript 库?的主要内容,如果未能解决你的问题,请参考以下文章
解密在 PHP 中使用 MCRYPT_RIJNDAEL_256 加密的 Python 字符串