如何保护客户端上使用的AES密码?

时间:2012-05-11 23:16:44

标签: javascript aes

我想在这里使用斯坦福大学的AES实施:

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

然而,如果我按照他们的建议使用它,它基本上是无用的

  

SJCL易于使用:只需运行sjcl.encrypt(“password”,“data”)即可   加密数据,或sjcl.decrypt(“password”,“encrypted-data”)。

任何人都可以简单地加载我的网站,查看java脚本并使用密码以与我相同的方式解密数据。

如何使此解决方案有用?

1 个答案:

答案 0 :(得分:1)

随着更多的来回反复,我想我更了解你想知道什么,给你一个答案。如果这是您正在寻找的,请告诉我。

通常,管理对称密钥非常困难。对称密码有两个主要用途:

  • 保护存储数据的隐私,供以后使用。如果您使用在线备份服务,您真的希望在上传到在线服务之前,在客户端上对您的数据进行加密 - 您不希望他们以明文访问您的数据。但是,当您将来解密数据时,提供密钥的那个。这意味着您可以将密钥存储在离线媒体(CD-R,USB记忆棒,SD卡,显示器旁边的小笔记本......)或在线(浏览器cookie,OS提供的某种钥匙串或标准文件)上。 ..)。

  • 保护双方传输过程中的数据隐私。一方加密数据,另一方解密数据。这就是间谍的沟通方式,TLS如何提供HTTPS客户端到服务器的安全性,SSH如何提供客户端到服务器的安全性。在这种情况下,双方需要同意将使用的密钥,这可以使用Diffie-Hellman-Merkle Key Exchange或使用public-key encryption algorithm such as RSA来完成,以允许一方加密随机生成的会话密钥。这种方式只能由另一方解密。

您找到的库看起来像第一种情况高度优化 - 允许用户加密他们的数据供您存储,然后再检索它们。因为他们使用password based key derivation function,它准备通过简单地键入键盘来处理可用的不良密码 - 该功能将允许建立更安全的密钥,而不仅仅是人类能够(或将会)键入的键盘

当然,可以用于第二种情况,但可能是你在具有完全TLS支持的浏览器中使用它,这可以提供端到端的安全性以防万一您选择使用客户端证书和服务器证书。

如果您选择允许用户通过您的软件存储加密数据,您一定要明确解密密钥的存储位置。我可以看到一个用例,用于在浏览器上存储cookie存储密钥 - 这样用户在需要数据时就不需要重新输入密钥。但如果他们更换机器或浏览器,他们需要知道密码,以便他们可以再次检索他们的数据。

但是,如果用户认为他们的数据是“安全的”,那么他们每次想要使用他们的数据时都应该重新键入他们的密钥。这样,用户单独负责密钥的安全性;允许暴露cookie数据的浏览器漏洞 - 或本地运行的恶意代码 - 不能简单地从磁盘上读取密钥。

所有这一切的缺点当然是没有一个简单的答案:你必须在存储密码的简单性之间决定不存储密码的安全性。