盐值组成许多会话密钥的一部分,如图所示。
与关键位一样,盐位也由随机数据组成。不同的是,关键点必须保持秘密,不惜一切代价,而盐值被公开。当使用CryptoAPI交换密钥时,密钥位在加密的密钥块内传输。另一方面,盐位以明文形式传输。
盐值的大小将根据所使用的CSP而有所不同。例如,Microsoft RSA Base Provider使用88位的盐值和40位的密钥值,总密钥大小为128位。即使盐位组成每个加密密钥的一部分,但在讨论密钥和密钥大小时通常会忽略它们。也就是说,当谈到Microsoft RSA Base Provider加密密钥时,我们将它们称为40位密钥。
使用相同的加密密钥发送或存储大量几乎相同的数据包时,盐值最为有用。通常,两个相同的数据包将加密成两个相同的密文数据包。然而,这将指示窃听者分组是相同的,并且因此可能被同时攻击。但是,如果每个数据包都发送了盐值,那么即使明文数据包相同,也会始终生成完全不同的密文分组。
因为盐值不需要保密,并且可以以与每个密文分组捆绑的明文形式传输,所以每个数据包改变盐值比改变键值本身要容易得多。
应用程序应使用CryptGenRandom功能生成盐值。重要的是,每个盐值都与其他盐值完全不同,特别是当使用流密码时。