使用NodeJS服务器进行文本散列的安全性

我有一个NodeJS服务器,我需要从客户端散列密码。 由于NodeJS应用程序没有编译,如果我用一种语言编写哈希进程,从中生成一个处理从我的NodeJS应用程序调用的进程的二进制文件,或者如果服务器受到攻击,犯罪者能够逆向处理哈希处理的二进制文件,就像从我的NodeJS应用程序的JS中读取一样简单。

散列 – 而不是encryption – 是一个单向的过程。 从纯文本中获取散列很容易,但是除非您碰巧猜测散列文本是什么,否则几乎不可能做到相反。

出于这个原因,你不需要保持你的哈希algorithm的秘密。 你不应该这样做,因为所有强者都是公开的,创造自己真的很难。

例如,SHA-256algorithm是公开的。 但尝试猜测我刚刚哈哈大笑:

 07123e1f482356c415f684407a3b8723e10b2cbbc0b8fcd6282c49d37c9c1abc 

你应该可以猜到它( 如果你能猜到的话,请评论一下 ),因为我的文本的目的非常简单,而且我使用了一个快速的散列函数 – 清楚地说明你需要保留一些东西心神:

  1. 你的哈希algorithm需要强大
  2. 即使对于强大的algorithm,您的密码也难以猜测
  3. 你的哈希函数应该尽可能慢(这听起来像是一个奇怪的软件要求 – 见下面的更多信息)

SHA-1或SHA-2速度很快,因此即使使用随机盐也不足以使密码安全。 但是你可以使用散列algorithm来进行任意复杂的计算(例如bcrypt)来使得猜测速度更慢,但总是可以的。

此外,使用随机盐,使彩虹桌无法使用。

您希望使用慢速,CPU密集型algorithm尽可能慢地进行猜测,同时仍然可以正常运行。 例如bcrypt(不使用SHA-1或SHA-2,而是Blowfish)除了盐之外,还有一个成本参数,您可以使用这个参数来生成所需的函数,代价高昂,使得猜测速度更慢使其毫无意义。 例如,如果你可以在100ms内迭代一次,那么等待真正的用户进行密码validation的时间并不长,但是很快就会被攻击者很快地猜到密码 – 每秒10次尝试每秒less于100万次。 这是一个类似于您可以在一秒钟内计算多less个SHA-256哈希值的数字。

更多信息请参阅:

感谢zaphLukePark对如何改进这个答案的意见。

我仍然在等待任何人猜测我的哈希消息,以certificate我的SHA-1不足以用于哈希密码。 提示:这个很短。