我需要加密双向(对称)不同的令牌。这些令牌应该是重复的(例如,它们是人名),但我不希望攻击者推断哪些加密的令牌来自相同的原始令牌。Salt是单向密码术(散列)的最佳选择。
有没有一种方法可以在对称密码学中工作,一种变通办法或替代方案?
发布于 2014-10-10 22:21:58
是。如果使用得当,对称加密不会揭示明文的任何信息,甚至不会揭示多个明文相同的事实。
正确使用意味着选择使用初始化向量( IV )或随机数(即不是ECB)的操作模式,并适当地选择IV(通常是随机字节)。使用相同的密钥和IV加密多个明文允许这种攻击,就像使用ECB模式一样,使用静态IV是一个常见的错误。
发布于 2018-05-02 06:00:27
如上所述,正确利用对称加密方案不会泄露关于明文的信息。您提到了保护用户免受对隐藏令牌的字典攻击的需要,而适当利用的加密方案(如GCM )将为您提供此属性。
我推荐使用GCM模式,因为它是一种高效的身份验证加密方案。对未经身份验证的数据执行加密功能可能会导致安全缺陷,因此使用经过身份验证的加密方案(如GCM )是最好的选择。请注意,此加密方案和其他CPA安全方案将为您提供安全性,以防止希望了解加密令牌的价值的对手。
例如,在正确实现的GCM模式中,相同姓氏的加密将导致不同的密文,即GCM模式是不确定的。
确保使用安全的填充方案并固定密文的长度,以确保攻击者不能使用密文的长度来了解有关生成此令牌的内容的一些信息。
但是要小心,您不能交替使用散列函数和对称加密方案,因为它们是为完全不同的目的而创建的。要注意如何共享密钥,并记住,一旦对手知道了密钥,密文就不再是随机的。
-注意-不正确地使用加密:如果每个用户都使用相同的密钥来加密他们的令牌,那么他们可以简单地解密每个人的令牌,并看到生成它的名称。为了安全起见,每个用户都必须使用不同的密钥进行加密,所以现在您必须以某种方式为每个用户存储和管理密钥。这可能是非常痛苦的,你必须非常小心。
但是,如果您正在使用盐和散列函数,那么即使每个用户都使用相同的盐来计算散列(名称||盐),恶意用户也必须使用盐来暴力强制所有可能的名称,以找出是什么生成了这些令牌。
因此,请注意这一点,因为散列函数和对称加密方案不能互换使用。
发布于 2016-11-26 23:46:41
假设唯一要加密的项是令牌(即,它们没有嵌入到更大的数据结构中),那么Inicialization Vectors (IV)就是可行的。
它们很容易理解:设M是令牌,填充以适应对称加密算法中使用的块大小(我假设它是AES),IV是随机数组,也是加密块的大小。
然后计算C= AES_ENCRYPT(M×xor,K),其中C是加密数据,K是对称密钥。这样,相同的消息M将不会以相同的方式被多次加密,因为IV每次都是随机获得的。
要解密M,只需计算M= (AES_DECRYPT(C,K) xor IV)。
当然,IV和K在解密时都必须是已知的。传输IV的最常见方法是只将其与密文一起发送。这不会影响安全性,它很像存储Salt值,因为加密密钥对其他所有人来说都是未知的。
https://stackoverflow.com/questions/26300016
复制相似问题