使用NodeJS服务器进行文本散列的安全性
我有一个NodeJS服务器,我需要从客户端散列密码。 由于NodeJS应用程序没有编译,如果我用一种语言编写哈希进程,从中生成一个处理从我的NodeJS应用程序调用的进程的二进制文件,或者如果服务器受到攻击,犯罪者能够逆向处理哈希处理的二进制文件,就像从我的NodeJS应用程序的JS中读取一样简单。
散列 – 而不是encryption – 是一个单向的过程。 从纯文本中获取散列很容易,但是除非您碰巧猜测散列文本是什么,否则几乎不可能做到相反。
出于这个原因,你不需要保持你的哈希algorithm的秘密。 你不应该这样做,因为所有强者都是公开的,创造自己真的很难。
例如,SHA-256algorithm是公开的。 但尝试猜测我刚刚哈哈大笑:
07123e1f482356c415f684407a3b8723e10b2cbbc0b8fcd6282c49d37c9c1abc
你应该可以猜到它( 如果你能猜到的话,请评论一下 ),因为我的文本的目的非常简单,而且我使用了一个快速的散列函数 – 清楚地说明你需要保留一些东西心神:
- 你的哈希algorithm需要强大
- 即使对于强大的algorithm,您的密码也难以猜测
- 你的哈希函数应该尽可能慢(这听起来像是一个奇怪的软件要求 – 见下面的更多信息)
SHA-1或SHA-2速度很快,因此即使使用随机盐也不足以使密码安全。 但是你可以使用散列algorithm来进行任意复杂的计算(例如bcrypt)来使得猜测速度更慢,但总是可以的。
此外,使用随机盐,使彩虹桌无法使用。
您希望使用慢速,CPU密集型algorithm尽可能慢地进行猜测,同时仍然可以正常运行。 例如bcrypt(不使用SHA-1或SHA-2,而是Blowfish)除了盐之外,还有一个成本参数,您可以使用这个参数来生成所需的函数,代价高昂,使得猜测速度更慢使其毫无意义。 例如,如果你可以在100ms内迭代一次,那么等待真正的用户进行密码validation的时间并不长,但是很快就会被攻击者很快地猜到密码 – 每秒10次尝试每秒less于100万次。 这是一个类似于您可以在一秒钟内计算多less个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对如何改进这个答案的意见。
我仍然在等待任何人猜测我的哈希消息,以certificate我的SHA-1不足以用于哈希密码。 提示:这个很短。