我需要加密双向(对称)不同的令牌。这些令牌有望重复(例如,他们是人名),但我不希望攻击者得出哪些加密令牌来自相同的原始令牌。 Salt是进行单向加密(哈希)的方法。
是否有一种方法可以用于对称加密,变通方法或替代方法?
答案 0 :(得分:2)
是。正确使用的对称加密并没有揭示明文的任何内容,甚至没有揭示多个明文相同的事实。
正确使用意味着选择使用初始化向量(IV)或随机数(即非ECB)的操作模式,并适当选择IV(通常是随机字节)。使用相同的密钥和IV加密多个明文允许这种攻击非常类似于ECB模式,并且使用静态IV是一个常见的错误。
答案 1 :(得分:2)
如上所述,正确使用对称加密方案不会泄露有关明文的信息。您提到需要保护用户免受对隐藏令牌的字典攻击,并且正确使用的加密方案(如GCM)将为您提供此属性。
我建议使用 GCM模式,因为它是一种有效的身份验证加密方案。对未经身份验证的数据执行加密功能可能会导致安全漏洞,因此使用经过身份验证的加密方案(如GCM)是您最好的选择。请注意,此加密方案以及其他CPA-SECURE方案将为您提供安全保护,以防止希望了解加密令牌价值的对手。
例如,在正确实现的GCM模式中,相同姓氏的加密将导致不同的密文,即GCM模式是非确定性的。
确保使用安全填充方案并确定密文的长度,以确保攻击者无法使用密文的长度来了解有关生成此令牌的内容的一些信息。
但要注意,您不能互换使用散列函数和对称加密方案,因为它们是为了不同的目的而创建的。小心你如何分享密钥,并记住,一旦对手知道密钥,密文就没有任何随机性。
-NOTE- 错误地使用加密:如果每个用户都使用相同的密钥来加密其令牌,那么他们只需解密其他人的令牌并查看生成它的名称。 为了安全起见,每个用户必须使用不同的密钥进行加密,因此现在您必须以某种方式为每个用户存储和管理密钥。这可能非常痛苦,你必须非常小心。
但是如果你正在使用salt和hash函数,那么即使每个用户都使用相同的salt来计算哈希值(name || salt),恶意用户也必须用盐来强制所有可能的名称来弄清楚是什么产生了这些代币。
因此请注意这一点并注意,因为哈希函数和对称加密方案不能互换使用。
答案 2 :(得分:-1)
假设要加密的唯一项目是令牌(也就是说,它们没有嵌入更大的数据结构中),那么Inicialization Vectors(IV's)就是最佳选择。
它们很容易理解:让M成为你的标记,填充以适应对称加密算法中使用的块大小(我假设它是AES),IV是随机的位数组,也是加密的大小块。
然后计算C = AES_ENCRYPT(M xor IV,K),其中C是加密数据,K是对称密钥。这样,由于每次随机获取IV,同一消息M将不会以相同的方式多次加密。
要解密M,只需计算M =(AES_DECRYPT(C,K)xor IV)。
当然,在解密时必须知道IV和K.传输IV的最常用方法是沿着加密文本发送它。这不会影响安全性,它非常类似于存储salt值,因为加密密钥对于其他人来说都是未知的。