我很擅长实施加密技术,而且我还在学习基础知识。
我的开源代码库需要对称加密功能。该系统有三个组件:
查看各种JavaScript库,我遇到了SJCL,它有一个可爱的演示页面:http://bitwiseshiftleft.github.com/sjcl/demo/
从这一点来看,似乎客户需要知道的(除了使用的密码)才能解密密文:
使用密文保存所有这些数据是否相对安全?请记住,这是一个开源代码库,除非我要求用户记住它们,否则我无法合理地隐藏这些变量(是的,是的)。
任何建议表示赞赏。
答案 0 :(得分:33)
初始化向量和盐被称为,而不是键,正是,因为它们不需要保密。将这些数据与加密/散列元素一起编码是安全的,也是习惯的。
只需使用给定的密钥或密码,IV或盐需要使用一次。对于一些算法(例如CBC加密),可能存在一些附加要求,通过随机选择IV,以均匀概率和加密强随机数发生器来实现。但是,保密不是IV或盐的必需属性。
对称加密很少能够提供安全性;加密本身可以防止被动攻击,攻击者可以观察但不会干扰。要防止主动攻击,您还需要某种身份验证。 SJCL使用结合了加密和身份验证的CCM或OCB2加密模式,所以没关系。 “认证强度”是专用于加密文本内的认证的字段的长度(以位为单位);强度为“64位”意味着试图改变消息的攻击者最大概率为2 -64 成功这样做而没有被认证机制检测到(并且他不知道他是否已经成功而没有尝试,即将更改的消息发送给知道密钥/密码的人。这对于大多数目的来说已经足够了。更大的身份验证强度意味着更大的密文(大致)相同的数量。
我没有看过实现,但从文档中可以看出SJCL作者知道他们的交易,并且做得很好。我建议使用它。
记住密码和Javascript的常见警告:
Javascript是在客户端运行但从服务器下载的代码。此要求以某种方式保护下载的完整性;否则,攻击者可能会注入一些自己的代码,例如一个简单的补丁,它也会记录用户在某处输入的密码副本。实际上,这意味着应该在SSL / TLS会话(即HTTPS)中提供SJCL代码。
用户是人类,人类在选择密码时表现不佳。这是人类大脑的局限。此外,计算机越来越强大,而人类的大脑或多或少保持不变。这使得密码越来越弱于字典攻击,即对密码的详尽搜索(攻击者试图通过尝试“可能的”密码来猜测用户的密码)。 SJCL生成的密文可用于离线词典攻击:攻击者可以在自己的计算机上“尝试”密码,而无需针对您的服务器进行检查,并且只受他自己的限制计算能力。 SJCL包含一些使离线字典攻击更加困难的功能: