我需要使用一个潜在的弱用户密码,并为JavaScript中的AES加密导出一个强密钥。我该怎么做?
我认为最困难的问题是生成一个好的随机盐--也许可以使用SSL请求来要求服务器提供一半的盐。这是可行的,但如果可能的话,我宁愿保持简单。
我应该用bcrypt吗?然而,对于速度慢的硬件(当前型号的智能手机)来说,可能需要多次迭代才能达到大约1秒。
我只需要支持现代浏览器,我的用户基础很小,每个人都是极客。
派生密钥将用于使用AES加密明文密码,类似于LastPass的工作方式。
发布于 2013-08-20 22:11:02
好的,对于浏览器中的密钥派生,您将使用第三方库。
如果你想成为这条线的绝对顶端,那么要考虑的潜在库是你最好的选择,根据你的用户将使用什么,有一个中等到高的工作因素。Bcrypt工作,但不是记忆困难,所以要考虑到这一点。(即使是5MB的内存使用量也会严重阻碍自定义硬件的使用来攻击您的密钥)
salt可以从crypto.getRandomValues导出,该数组接受一个类型化数组,并返回填充了可信赖的随机数据的salt。
发布于 2013-08-21 02:47:24
你做不到,你能做的最好的就是像PBKDF2,氪或者bcrypt之类的东西。但他们不会产生一个强大的密码密钥。如果以弱密码或弱密码开始,并从中派生密码密钥,则结果将不可避免地不是很强。像PBKDF2、scrypt或bcrypt这样的函数并不是一颗银弹。他们让事情变得不那么糟糕,但最终,它仍然是坏的;它只是不那么糟糕。这肯定不太好,也不会产生我称之为强项的钥匙。
你能做的第一件事是:不要那样做。不要从密码或密码生成密码密钥。人类并不擅长选择或记忆高熵密码/密码。因此,考虑到我们对人类行为的了解,如果您从密码/密码中获得密码密钥,您的数据将比人们所希望的安全得多。
相反,如果您希望具有较强的安全性,请选择一个真正随机的加密密钥(而不是从密码/密码中派生的密钥)。使用正确的密钥管理。是的,这是更多的工作。实现强大的安全确实需要更多的工作。根据您的需求,您甚至可能无法在浏览器环境中实现您的安全目标。这就是生活。如果你需要强大的安全性,你能做的最糟糕的事情就是给用户一种错误的安全感:让他们认为自己是安全的,而实际上他们只有有限的保护。
发布于 2013-08-20 23:25:46
如果你重视简单和良好的保护,这就是我的建议:
由于与各种浏览器的兼容性问题,我不建议使用crypto.getRandomValues来获取salt。见此处:https://stackoverflow.com/questions/16084766/compatibility-of-window-crypto-getrandomvalues
https://crypto.stackexchange.com/questions/9374
复制相似问题