我有一个NodeJS服务器,我需要从客户端散列密码。由于NodeJS应用程序没有编译,我用一种语言编写散列过程会更安全,我可以从中生成一个二进制文件来处理从我的NodeJS应用程序调用的进程,或者如果服务器被泄露,那么犯罪者能够像处理我的NodeJS应用程序的JS一样轻松地对处理散列过程的二进制文件进行逆向工程吗?
答案 0 :(得分:1)
哈希 - 与加密相对 - 是一个单向过程。从纯文本中获取哈希很容易,但是反过来几乎不可能,除非你碰巧猜到了哈希文本是什么。
因此,您无需保持散列算法的安全性。你不应该这样,因为所有强者都是公开的,而且很难发明自己的。
例如,SHA-256算法是公共的。但是试着猜测我刚才所做的事情:
07123e1f482356c415f684407a3b8723e10b2cbbc0b8fcd6282c49d37c9c1abc
如果你尝试的话,你应该可以猜到它(如果你猜的话请评论!),因为我的文字非常简单,我故意使用快速哈希功能 - 制作很明显,你需要记住一些事情:
SHA-1或SHA-2速度很快,因此即使使用随机盐也不足以使密码安全。但是你可以使用具有任意复杂计算的散列算法(例如bcrypt)来使猜测变得更慢,但它总是可能的。
另外,使用随机盐使彩虹表无法使用。
您希望使用缓慢的CPU密集型算法,使猜测尽可能慢,同时仍然可以进行正常操作。例如。除了盐之外,bcrypt(不使用SHA-1或SHA-2但是Blowfish)有一个成本参数,可以用来使得结果函数成本高昂,使得猜测变慢到制作点没有意义。例如。如果您可以进行一次迭代持续100ms,那么等待真实用户进行密码验证仍然不是很长,但是攻击者很快就会慢慢猜出密码 - 每秒10次尝试每天不到一百万次。它的数字类似于您可以在一秒钟内计算出多少SHA-256哈希值。
有关详细信息,请参阅:
感谢 zaph 和 LukePark ,以获取有关如何改进此答案的评论。
我还在等待让任何人猜测我的哈希消息来证明我的SHA-1不足以用于散列密码。 提示:很短。