我有一个 NodeJS 服务器,我需要在其中对客户端的密码进行哈希处理。由于 NodeJS 应用程序未编译,对于我来说,用一种语言编写哈希过程是否会更安全,我可以从中生成一个二进制文件来处理从我的 NodeJS 应用程序调用的该过程,或者如果服务器受到威胁,会不会犯罪者能够对处理哈希过程的二进制文件进行逆向工程,就像从我的 NodeJS 应用程序的 JS 中读取它一样容易吗?
最佳答案
散列 - 与加密相反 - 是一种单向过程。从纯文本中获取哈希很容易,但几乎不可能执行相反的操作,除非您碰巧猜到哈希文本是什么。
因此,您无需对哈希算法保密。你不应该真的这样做,因为所有的强者都是公开的,你很难发明自己的。
例如,SHA-256 算法是公开的。但尝试猜测我刚刚散列的内容:
07123e1f482356c415f684407a3b8723e10b2cbbc0b8fcd6282c49d37c9c1abc
如果您尝试的话,您应该能够猜到(如果您能猜到,请发表评论!),因为我的文本故意非常简单,并且我故意使用了快速哈希函数 - 使很明显,您需要记住以下几点:
- 您的哈希算法需要强大
- 即使使用强大的算法,您的密码也必须难以猜测
- 您的哈希函数应该尽可能慢(这可能听起来像是对软件的奇怪要求 - 有关详细信息,请参阅下文)
SHA-1 或 SHA-2 速度很快,因此不足以确保密码安全,即使使用随机盐也是如此。但是您可以使用具有任意复杂计算的哈希算法(例如 bcrypt)来减慢猜测速度,但这始终是可能的。
此外,使用随机盐使彩虹表无法使用。
您希望使用缓慢的、CPU 密集型算法来使猜测尽可能慢,同时仍使正常操作成为可能。例如。 bcrypt(不使用 SHA-1 或 SHA-2,但使用 Blowfish)除了 salt 之外还有一个成本参数,您可以使用该参数使结果函数的成本达到您想要的程度,从而使猜测速度变慢这毫无意义。例如。如果你可以在 100 毫秒内进行一次迭代,那么等待真实用户验证密码的时间仍然不会很长,但攻击者快速猜测密码的速度就慢得多 - 每秒 10 次尝试少于每天 100 万次。这个数字类似于您在一秒钟内可以计算出的 SHA-256 哈希值。
更多信息请参见:
- https://en.wikipedia.org/wiki/Cryptographic_hash_function
- https://en.wikipedia.org/wiki/Key_derivation_function
- https://en.wikipedia.org/wiki/Rainbow_table
- https://en.wikipedia.org/wiki/Bcrypt
- https://en.wikipedia.org/wiki/PBKDF2
感谢 zaph 和 LukePark 对于如何改进此答案的评论。
我仍在等待任何人猜测我的哈希消息,以证明我的 SHA-1 不足以对密码进行哈希处理。 提示:它很短。
关于node.js - NodeJS 服务器文本哈希的安全性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41810092/