散列加盐和随机数 nonce 有什么区别?

73

我已经了解了这两个主题,但似乎无法完全理解散列盐值和散列随机数之间的区别。


使用盐值+随机数来进行登录认证过程,请参考此答案:https://stackoverflow.com/a/24978909/43615 - Thomas Tempelmann
3个回答

69

盐(salt)是一种非机密的随机值,用于确保相同的明文不会一致地散列到相同的输出值;它用于防止预先计算攻击,例如彩虹表

一次性数字(Nonce)是与加密方案中的消息相关联的值,通常是随机生成的,并且在某些指定范围内必须是唯一的(例如特定的时间间隔或会话)。它通常用于防止重放攻击

Nonce和Salt类似并具有相关目的,但并不相同。它们两者通常是随机生成的、非机密的,并用于防止否则可能针对系统进行的攻击。它们主要的区别在于使用的上下文和重复的后果 - 重复的盐无关紧要,但是重复的nonce可能会产生严重的后果。


@DarkSquirrel42 很好的观点。我试图想到一个需要nonce保密的情况,但是一时想不出来。 - Nick Johnson
由于这是stackoverflow,我要指出,由于NONCE是一个数字,您需要在将其用于加密协议之前了解数字的编码方式(转换为字节序列)。大多数情况下,它只是一组静态字节(对于随机NONCEs),但不必如此。 - Maarten Bodewes
1
@owlstead 除非你只是将其视为一个单位(如nonce),否则你总是需要知道数据的编码方式。尽管“NONCE”的定义包括“数字”,但它实际上不必是数字。 - Nick Johnson
使用盐值+随机数来进行登录认证过程,请参考此答案:https://stackoverflow.com/a/24978909/43615 - Thomas Tempelmann

16

nonce是“一次性使用的数字”的意思。如果您为要哈希的每个数据位生成唯一的盐值,则它本质上也是nonce。


如果双方使用它进行加密而不是哈希,则必须使nonce对双方都可用,对吗? - Ryan Ward Valverde
1
是的。在这种情况下,nonce将成为初始化向量的一部分(如果不是全部)。 - Marc B
数据库上的主键在技术上是一个一次性的随机数。我认为他指的是加密用的一次性随机数... - rook
不存在所谓的“加密”NONCE,如果您有一个值的单一来源,那么您可以使用序列号。您可以拥有一个随机的nonce,如果您不比较nonces,则随机数应该足够大。 - Maarten Bodewes

12

哈希是一种单向过程,不像加密(使用密钥可以解密),它生成固定大小的值,并且数据的轻微更改会产生全新的哈希值。 它就像指纹一样。例如:MD5、MD6、SHA-1、SHA-2等。


以哈希格式在数据库中存储密码也不安全,因为可以使用彩虹表、字典攻击和暴力破解(GPU每秒可以计算数十亿个哈希)。 为了避免这些问题,我们需要使用

使用(随机数)使得相同的密码不总是生成相同的密钥。即添加盐只是为了使常见密码变得不常见。

是我们添加到哈希中的东西,以防止使用彩虹表进行彩虹攻击,彩虹表基本上只是将哈希转换为密码的大型查找表,如下所示:

dffsa32fddf23safd -> passwordscrete 
f32ksd4343fdsafsj -> stackoverflow

黑客可以找到这个彩虹表,为了避免这个问题,我们必须将哈希与密码和盐的组合一起存储。

hash= hashFunction(passowrd+salt)

Nonce(仅使用一次的数字)不需要保密或随机,但不能在相同密钥下重复使用。这用于防止重放攻击(也称为回放攻击)。

hashing-vs-encryption


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接