首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在JavaScript中完成密钥派生?

如何在JavaScript中完成密钥派生?
EN

Cryptography用户
提问于 2013-07-22 19:07:12
回答 3查看 2K关注 0票数 2

我需要使用一个潜在的弱用户密码,并为JavaScript中的AES加密导出一个强密钥。我该怎么做?

我认为最困难的问题是生成一个好的随机盐--也许可以使用SSL请求来要求服务器提供一半的盐。这是可行的,但如果可能的话,我宁愿保持简单。

我应该用bcrypt吗?然而,对于速度慢的硬件(当前型号的智能手机)来说,可能需要多次迭代才能达到大约1秒。

我只需要支持现代浏览器,我的用户基础很小,每个人都是极客。

派生密钥将用于使用AES加密明文密码,类似于LastPass的工作方式。

EN

回答 3

Cryptography用户

发布于 2013-08-20 22:11:02

好的,对于浏览器中的密钥派生,您将使用第三方库。

如果你想成为这条线的绝对顶端,那么要考虑的潜在库是你最好的选择,根据你的用户将使用什么,有一个中等到高的工作因素。Bcrypt工作,但不是记忆困难,所以要考虑到这一点。(即使是5MB的内存使用量也会严重阻碍自定义硬件的使用来攻击您的密钥)

salt可以从crypto.getRandomValues导出,该数组接受一个类型化数组,并返回填充了可信赖的随机数据的salt。

票数 3
EN

Cryptography用户

发布于 2013-08-21 02:47:24

你做不到,你能做的最好的就是像PBKDF2,氪或者bcrypt之类的东西。但他们不会产生一个强大的密码密钥。如果以弱密码或弱密码开始,并从中派生密码密钥,则结果将不可避免地不是很强。像PBKDF2、scrypt或bcrypt这样的函数并不是一颗银弹。他们让事情变得不那么糟糕,但最终,它仍然是坏的;它只是不那么糟糕。这肯定不太好,也不会产生我称之为强项的钥匙。

你能做的第一件事是:不要那样做。不要从密码或密码生成密码密钥。人类并不擅长选择或记忆高熵密码/密码。因此,考虑到我们对人类行为的了解,如果您从密码/密码中获得密码密钥,您的数据将比人们所希望的安全得多。

相反,如果您希望具有较强的安全性,请选择一个真正随机的加密密钥(而不是从密码/密码中派生的密钥)。使用正确的密钥管理。是的,这是更多的工作。实现强大的安全确实需要更多的工作。根据您的需求,您甚至可能无法在浏览器环境中实现您的安全目标。这就是生活。如果你需要强大的安全性,你能做的最糟糕的事情就是给用户一种错误的安全感:让他们认为自己是安全的,而实际上他们只有有限的保护。

票数 1
EN

Cryptography用户

发布于 2013-08-20 23:25:46

如果你重视简单和良好的保护,这就是我的建议:

  1. 将弱用户PW输入PBKDF2-SHA1。这里有一些简洁的js实现,比如Parvez Anandam的实现。用户可以根据自己的喜好调整迭代次数(对值低于几分钟的警告)--大约10000次迭代会给平均智能手机上大约1秒的延迟。 注意到,javascript中的bcrypt实现相当复杂,而scrypt则更加复杂--以至于我放弃了它。PBKDF2算法性能良好,使用简单。
  2. PBKDF2的一个可接受的盐可以通过散列来实现(用户-一些简单的随机值)。

由于与各种浏览器的兼容性问题,我不建议使用crypto.getRandomValues来获取salt。见此处:https://stackoverflow.com/questions/16084766/compatibility-of-window-crypto-getrandomvalues

票数 0
EN
页面原文内容由Cryptography提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://crypto.stackexchange.com/questions/9374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档