【问题标题】:Is CCKeyDerivationPBKDF thread safe?CCKeyDerivationPBKDF 线程安全吗?
【发布时间】:2012-12-13 21:23:11
【问题描述】:

我正在使用CCKeyDerivationPBKDF 在并发环境中生成和验证密码哈希,我想知道它是否是线程安全的。该函数的文档根本没有提到线程安全,所以我目前使用锁是为了安全起见,但如果我不需要,我宁愿不使用锁。

【问题讨论】:

    标签: python c concurrency pbkdf2 commoncrypto


    【解决方案1】:

    查看CCKeyDerivationPBKDF() 的源代码后,我发现它是“线程不安全的”。虽然CCKeyDerivationPBKDF() 的代码使用了许多线程安全的库函数(例如:bzero),但大多数用户定义的函数(例如:PRF)以及从这些用户定义的函数调用的底层函数都是潜在的线程不安全。 (例如,由于使用了多个指针和不安全的内存转换,例如在CCHMac 中)。我会建议,除非他们使所有底层函数成为线程安全的,或者有一些机制来改变它有条件地线程安全,坚持你的方法,或者修改commoncrypto 代码以使其成为线程安全并使用该代码。

    希望对你有帮助。

    【讨论】:

      【解决方案2】:

      缺乏文档或源代码,一种选择是构建一个测试应用程序,其中 10 个线程循环调用 CCKeyDerivationPBKDF,从 10 个不同的参数集中随机选择 10 个已知结果。

      每个线程都会检查调用的结果以确保它符合预期。在这个循环中,每个线程还应该有一个随机时间量的 usleep() 调用(钟形曲线位于每次调用 CCKeyDerivationPBKDF 的时间的 10%),以便尝试尽可能多地交错操作。

      您可能希望对其进行调试,以跟踪您能够生成多少并发。使用 10% 的睡眠时间和 10 个线程,您应该能够保持 9 个线程并发。

      如果它通过总计 100,000,000 次调用而没有出现错误,我会认为它是线程安全的。当然,您可以运行更长的时间以获得更大的保证。

      【讨论】: