PasswordDeriveBytes实现 PBKDF1 密钥派生功能。KDF 是将一段秘密数据(这里是“密码”,即适合人类大脑并可以用人类手指输入的数据)转换为足以满足算法需要的比特序列的函数。对称密钥(例如对称加密)。KDF 不适用于其他任何东西,尤其是密码存储。
散列函数可以用作 KDF,前提是您需要的对称密钥不超过散列函数输出大小。但是,这样的 KDF 将非常粗糙。好的 KDF 应该提供的一个特性是足够慢。这是因为“密码”本质上容易受到穷举搜索的影响(也称为“字典攻击”:用户倾向于选择简单的单词或组合作为密码,只需几百万或数十亿次尝试就可以猜到)。在给定的系统中,通常可以容忍相对较慢的 KDF:尝试进行身份验证的用户不会看到密钥派生函数的 1µs 和 1ms 延迟之间的差异;但是 1000 倍的减速对攻击者来说是致命的:
PBKDF1 包含一个“迭代计数”,这是一个专门用于此目的的参数:以可配置的方式使密钥派生足够慢。一个简单的哈希函数太快了。作为 KDF 的使用正是您更喜欢 PBKDF1 而不是散列函数的地方。实际上,不推荐使用 PBKDF1;来自相同标准的 PBKDF2应该更健壮。
哈希函数是比 KDF 更通用的对象,并且有许多 KDF 不满足的其他用途。
你想要做什么还不清楚:你使用术语“签名”,这通常意味着“非对称数字签名”,就像 RSA 或 ECDSA 一样;有些人倾向于使用术语“签名”来指定对称完整性检查,例如MAC(称其为“签名”是不恰当的,但很普遍)。但是,这在某些时候需要一些秘密,一个密钥,而哈希函数是无密钥的。