在JavaScript中使用Cryptography的场景有什么意义?

时间:2017-05-24 09:49:27

标签: javascript encryption

我的朋友有一个想法是保护浏览器中存储的Cookie,并使用Stanford Javascript Crypto Library等库添加加密。

同时我相信这样的行为是不可能的,因为javascript has no access to file system.

问题是:

该库的功能是什么?

它加密了什么? 我相信它的加密将限制为js应用程序的variables而不是主机上的文件

2 个答案:

答案 0 :(得分:1)

事实上,Cookie可以通过JavaScript访问,就像DOM一样。

您可以通过加密算法运行要存储的值来加密它们。

根据您要存储的内容以及加密/解密机制的工作原理,这可能是一个好主意,也可能不是。

答案 1 :(得分:1)

你问

  

可以使用javascript加密哪种数据?

和Bergi在comments

中回答了这个问题
  

通常,您可以加密可以二进制表示的所有数据

这是真的,但这不是你实际想要问的问题。我相信您正在寻找加密库在浏览器中有用的场景。但更多的是关于这一点。

  

我相信它的加密将仅限于js应用程序的变量而不是主机上的文件

是和否。可以通过JavaScript访问的任何内容都可以加密。此加密是否会增加任何安全性是另一个问题。可以加密可通过JavaScript代码中的变量访问的值。用户输入也是如此,其中包括用户明确打开的文件,以便在文件对话框(example)中上传。 此外,如果您真的需要,您的JavaScript代码会access to the whole file system in Chrome

以下是在JavaScript中使用加密技术可能有意义的一些情况,但并非所有这些都是推荐的(并非详尽无遗,但很常见):

  • 文件存储(即Mega),其中对称加密密钥永远不会发送到服务器但保留在客户端上或由用户直接输入。它的安全性取决于您是否相信服务提供商不会更改自己的JavaScript并记录用于加密的密钥。

  • 密码管理器(即clipperz)类似于文件存储,但其代码被注入其他站点,并且必须具有弹性,以免脱口而出所有秘密。它可以使用许多不同的加密原语。

  • 穷人的HTTPS(即太多 Stack Overflow问题)服务器拥有其RSA私钥并通过HTTP发送RSA公钥(sic!)到浏览器。浏览器可以加密任何数据并将其发送回服务器(也可能在此过程中建立对称密钥)。服务器可以使用其私钥解密消息并进行响应。只要没有中间人攻击者只是注入自己的JavaScript来将任何浏览器数据复制到攻击者的服务器,这就是安全的。在这个用例中,SJCL实现了ElGamal加密而不是RSA。

  • 在上传之前散列数据,以检查传输错误或实现重复数据删除(无需上传文件,因为其他人已经这样做了)。 Hashing在技术上属于密码学领域,而且还有许多库。

  • 在使用其他语言实现相同算法时,可以直接使用有效且易于使用的实现或算法的在线计算器(即my authenticated encryption tests)。数据永远不会发送到服务器,而是纯粹在浏览器中加密。我的计算器"可以用来测试自己的实现,因为它是由各种测试向量验证的。其他人可以帮助朋友在没有正确的电子邮件加密的情况下传递隐藏的邮件。

这些不应该使用基于浏览器的加密:

  • 如果您仅通过HTTP 使用对称加密,并且服务器客户端上存在完全相同的密钥,那么您有一个问题,因为密钥必须以某种方式发送给客户端到服务器或返回。如果将加密密钥从服务器发送到客户端,或者相反,则需要加密对称加密密钥。最简单的方法是使用TLS。如果您使用TLS,那么数据和密钥都是加密的,因此您不需要自己加密。这并没有提供任何安全性,只需要一点点混淆。任何被动攻击者(观察者)都可以阅读您的消息。您应该阅读:Javascript Cryptography Considered Harmful

  • 哈希密码登录是一种不好的做法。普遍的共识是,您需要多次哈希密码(PBKDF2,bcrypt,scrypt,Argon2),以检查用户是否发送了正确的用户名和密码。有些人认为,如果我们在客户端上进行哈希,则密码不会通过网络以明文形式发送,并且一切都是安全的。问题是,如果他们认为,他们不使用HTTPS(他们需要)。同时,哈希密码是他们的新密码。如果服务器没有实现常数时间比较,则使用定时侧通道攻击以任何您知道用户名的人登录琐事

  • JWT会话:Part 1part 2