Encryption 对称密码学与salt

Encryption 对称密码学与salt,encryption,cryptography,salt,encryption-symmetric,Encryption,Cryptography,Salt,Encryption Symmetric,我需要加密双向(对称)不同的令牌。这些令牌预计会重复(例如,它们是人名),但我不希望攻击者断定哪些加密令牌来自相同的原始令牌。Salt是单向加密(散列)的一种方式 是否有一种方法可以在对称加密、变通方法或替代方法中工作?是。如果使用得当,对称加密不会透露任何关于明文的信息,甚至不会透露多个明文是相同的事实 正确使用意味着选择使用初始化向量(IV)或nonce(即,不是ECB)的操作模式,并适当地选择IV(通常是随机字节)。使用同一密钥和IV加密多个明文与ECB模式非常相似,使用静态IV是一个常见

我需要加密双向(对称)不同的令牌。这些令牌预计会重复(例如,它们是人名),但我不希望攻击者断定哪些加密令牌来自相同的原始令牌。Salt是单向加密(散列)的一种方式


是否有一种方法可以在对称加密、变通方法或替代方法中工作?

是。如果使用得当,对称加密不会透露任何关于明文的信息,甚至不会透露多个明文是相同的事实


正确使用意味着选择使用初始化向量(IV)或nonce(即,不是ECB)的操作模式,并适当地选择IV(通常是随机字节)。使用同一密钥和IV加密多个明文与ECB模式非常相似,使用静态IV是一个常见的错误。

假设需要加密的唯一项目是令牌(即,它们没有嵌入到更大的数据结构中),则初始化向量(IV)是一种方法

它们很容易理解:让M作为您的令牌,填充以适合对称加密算法中使用的块大小(我假设它是AES),IV是位的随机数组,也是加密块的大小

然后计算C=AES_ENCRYPT(M xor IV,K),其中C是加密数据,K是对称密钥。这样,相同的消息M将不会以相同的方式多次加密,因为每次都随机获得IV

要解密M,只需计算M=(AES_decrypt(C,K)xor IV)


当然,在解密时必须知道IV和K。传输IV最常用的方法是沿着加密文本发送。这不会影响安全性,这与存储salt值非常相似,因为加密密钥对其他人来说都是未知的。

如上所述,正确使用对称加密方案不会泄露有关明文的信息。您提到需要保护用户免受对隐藏令牌的字典攻击,并且正确使用的加密方案(如GCM)将为您提供此属性

我建议使用GCM模式,因为它是一种有效的身份验证加密方案。对未经身份验证的数据执行加密功能可能会导致安全缺陷,因此使用经身份验证的加密方案(如GCM)是最佳选择。请注意,此加密方案以及其他CPA-SECURE方案将为您提供针对希望了解加密令牌价值的对手的安全性

例如,在正确实施的GCM模式中,相同姓氏的加密将导致不同的密文,即GCM模式是不确定的

确保使用安全填充方案并固定密文的长度,以确保攻击者不能使用密文的长度来了解有关生成此令牌的内容的信息

但是要小心,不能互换使用哈希函数和对称加密方案,因为它们是为完全不同的目的创建的。要注意如何共享密钥,并记住,一旦对手知道密钥,密文就不会有任何随机性

-注- 不正确地使用加密:如果每个用户都使用相同的密钥加密他们的令牌,那么他们可以简单地解密其他所有人的令牌并查看生成它的名称。 为了安全起见,每个用户都必须使用不同的密钥进行加密,因此现在您必须以某种方式为每个用户存储和管理密钥。这可能非常痛苦,你必须非常小心

但是,如果您正在使用salt和散列函数,那么即使每个用户都在使用相同的salt来计算散列(name | | salt),恶意用户也必须使用salt强制所有可能的名称,以找出这些令牌的生成原因


所以要考虑到这一点,并且要小心,因为散列函数和对称加密方案不能互换使用

请注意,您可能需要将用户名填充到特定的大小,除非您同意泄漏有关用户名大小的信息。@ntoskmi非常密集的答案。你能指出一个资源,可以进一步阐述什么是ECB以及如何在解密时知道IV吗?@yannisf Wikipedia有一篇关于ECB的文章。请特别注意一组描绘企鹅的图像。您只需将IV与密文一起发送即可;它不需要保密。@ntoskrnl请看,向下滚动到企鹅。假设要加密的数据小于或等于块大小,但情况可能并非如此,而且对于如何以安全的方式填充数据以及如何在解密时删除数据也没有帮助。一般的方法是将CBC模式与PKCS#7填充选项一起使用,其中IV是每个加密的不同随机值,并以加密数据为前缀。你是对的,这可能是一个错误的假设。在这种情况下,强烈建议使用CBC。为了澄清,CBC模式包括执行与我的回答中所述相同的操作,但使用先前的加密块进行异或操作,而不是使用非序列化向量。