我正在搜索一个提供安全加密的JavaScript库。客户端必须生成一个密钥,并且上传到服务器的所有数据都是加密的,所有下载的数据都是解密的。我需要一个经过身份验证的加密方案,只是点击率或 CBC 是不够的。
我听说过 sjcl,但似乎 sjcl 只能一次加密整个数据。我没有找到逐块加密数据的方法。由于上传的文件可能非常大,因此此方法不可行。我需要类似java加密接口的东西,有两个方法update()和final()。
我找到了 nodeJS 加密库,它似乎可以满足我的需要,但我不知道如何在浏览器端使用它。
我找到了谷歌crypto-js,但这个库似乎不提供经过身份验证的加密,而只提供标准模式。
有没有办法使用 sjcl 块加密数据?要在浏览器端使用 nodeJS 加密库?要将经过身份验证的加密与加密 js 一起使用?或者有没有另一个安全的javascript库可以提供我需要的东西?
简答题
恐怕这并非不可能。
长答案
因为你不能保证Javascript库的完整性,所以你不能依赖它做你期望它做的事情。因此,您无法保证任何安全性。
这个问题已经进行了广泛的讨论,并且总是以相同的结论结束:没有任何双向身份验证和安全通道,您的客户端就无法验证库的正确性。如果任何中间人改变了加密例程,您的客户不会知道,更不用说您永远不会发现了。
因此,为了保证安全性,您将需要SSL和客户端证书。
(当然,不存在无保证的安全性)
SJCL 部署的 CCM 中的 Appart 是一种流密码模式,我会仔细研究它,而不仅仅是查看便利包装器。它是开源的,所以无论如何都应该在某个地方实现原始密码。
请注意,这不是最终应该信任的代码。当我尝试为它编写Java包装器时,我很快发现了身份验证失败的错误。似乎便利库根本没有对关联的身份验证数据进行身份验证。由于它没有用其他库进行测试,我敦促您注意不要存在一些遗留的错误。
理由需要从客户端推送到不受信任的服务器吗?
如果交付网站的服务器是受信任的,那么您应该能够将数据发布回受信任的服务器,让受信任的服务器加密,然后受信任的服务器可以将数据发送到不受信任的服务器进行存储。