我正在使用CCKeyDerivationPBKDF
在并发环境中生成和验证密码哈希值,我想知道它是否是线程安全的。该功能的文档根本没有提到线程安全性,所以我目前正在使用锁定以保证安全,但如果我不需要,我宁愿不使用锁定。
答案 0 :(得分:1)
在浏览CCKeyDerivationPBKDF()
的源代码后,我发现它是"线程不安全"。虽然CCKeyDerivationPBKDF()
的代码使用许多线程安全的库函数(例如:bzero
),但大多数用户定义的函数(例如:PRF
)和从这些函数调用的底层函数用户定义的函数,可能是线程不安全的。 (例如,由于使用了几个指针和不安全的内存转换,例如在CCHMac
中)。我建议除非他们让所有底层函数都是线程安全的或者有一些机制来修改它使它有条件地线程安全,坚持你的方法,或者修改commoncrypto
代码以使其成为线程安全的并使用该代码
希望它有所帮助。
答案 1 :(得分:0)
缺乏文档或源代码,一个选项是构建一个测试应用程序,例如10个线程循环调用CCKeyDerivationPBKDF,随机选择10个不同的参数集,其中包含10个已知结果。
每个线程都会检查调用的结果,以确保它符合预期。每个线程也应该在一个随机的时间内进行usleep()调用(在每次调用CCKeyDerivationPBKDF的时候占用10%的时间),以便尝试尽可能地交错操作。
您可能希望通过调试来检测它,以跟踪您能够生成多少并发性。使用10%的休眠时间和10个线程,您应该能够保持9个线程并发。
如果它通过累计说100,000,000次调用没有错误,我认为它是线程安全的。当然,为了获得更大的保证,你可以运行它的时间更长。