这似乎被误导了。
来自任何来源的以秒为单位的时间几乎没有任何熵,并且几乎可以立即猜测。如果您的操作系统允许运行进程的微秒粒度,那么您将从较低的位获得 4 或 5 位的熵,但如果有人找到获得准确系统正常运行时间的方法,则要少得多。
然后你在谈论 MD5,在这种情况下它并不是很有用。它所做的一切给你的印象是你让它变得更加随机,但实际上并没有让它变得随机。实际上,您只有几个相互依赖的整数(处理时间总是与系统正常运行时间同步)并且完全是非随机的。您的系统几乎肯定会以一种或另一种形式泄露其正常运行时间。实际上,您最好使用PHP 之类的LCGrand(),因为无法轻易猜出内部状态。
这种随机数生成方法很糟糕,因为它根本不是随机的,并且可以预测。然而,盐实际上并不需要特别随机,它们只需要是唯一的;他们只是为了防止彩虹桌攻击。不可预测性会有所帮助(请参阅“如何储存盐?”),但并非完全需要。无论如何,使盐难以预测有一些好处。
如果您在 Linux 上,请从中读取一些字节/dev/urandom以生成盐 - 除了获取这些字节并使用它们之外,您不需要做任何其他事情,因为它们已经是强随机数。
如果不是,您可以生成盐作为SHA256(username || email || time || mt_rand())where||表示连接,time是当前系统时间的分辨率,并且mt_rand()是您的编程语言默认库中可用的任何随机生成器的输出值。在 PHP 中你应该使用mt_rand而不是rand,因为它有更好的特性。这为盐提供了足够的熵,因此很难远程猜测,特别是考虑到重用用户名和电子邮件组合的机会有限。
对于存储密码,您绝对应该使用 PBKDF2 或 bcrypt。单次使用加密哈希函数不足以保护您免受暴力攻击,尤其是当如今几乎每个人都拥有兼容 OpenCL 的 GPU 时。