Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Security 密码:前置与追加_Security_Hash_Password Protection_Salt - Fatal编程技术网

Security 密码:前置与追加

Security 密码:前置与追加,security,hash,password-protection,salt,Security,Hash,Password Protection,Salt,我刚刚查看了Django中密码散列的实现,并注意到,因此散列的创建类似于sha1(salt+password) 在我看来,盐有两个好处 防止彩虹表查找 好吧,在彩虹桌上加盐并没有什么区别 加强对暴力/字典攻击的防御 这就是我的问题。如果有人想攻击被盗密码数据库中的单个密码,他需要尝试大量密码(例如字典单词或[a-Za-z0-9]排列) 假设我的密码是“abcdef”,salt是“salt”,攻击者尝试所有[a-z]{6}个密码 对于预先添加的salt,必须计算散列(“salt”),存储散列算法的

我刚刚查看了Django中密码散列的实现,并注意到,因此散列的创建类似于
sha1(salt+password)

在我看来,盐有两个好处

  • 防止彩虹表查找

    好吧,在彩虹桌上加盐并没有什么区别

  • 加强对暴力/字典攻击的防御

    这就是我的问题。如果有人想攻击被盗密码数据库中的单个密码,他需要尝试大量密码(例如字典单词或[a-Za-z0-9]排列)

    假设我的密码是“abcdef”,salt是“salt”,攻击者尝试所有[a-z]{6}个密码

    对于预先添加的salt,必须计算
    散列(“salt”)
    ,存储散列算法的状态,然后从该点开始进行每个排列。也就是说,遍历所有排列将需要26^6复制哈希算法的-state-struct操作和26^6
    hash(a-z]{6}的排列)
    操作。由于复制散列算法的状态速度非常快,因此无论它有多长,salt都不会增加任何复杂性

    但是,使用附加的salt,攻击者必须为每个置换计算
    散列(a-z]{6}+salt的置换)
    ,从而导致26^10个散列操作。所以很明显,添加盐会根据盐的长度增加复杂性


  • 我不认为这是出于历史原因,因为Django是一个相当新的东西。那么,预先添加盐有什么意义呢?

    两者都不要,使用类似的标准。永远不要使用你自己的密码。很容易出错。PBKDF2使用许多迭代来防止bruteforce,这是比简单排序更大的改进


    在处理salt之后,预先计算hash函数内部状态的技巧可能不那么容易实现,除非salt的长度与底层块密码的块长度相对应。

    当然,您的观点是正确的;但是,实际上,如果您想增加计算散列所需的时间,只需使用更长的散列即可。例如,SHA256而不是SHA1。

    如果salt被预先添加,攻击者可以为salt创建哈希状态数据库(假设salt足够长,可以执行哈希步骤),然后运行字典攻击


    但若附加了salt,则攻击者可以将此类数据库作为密码字典,并另外只计算salt的哈希。由于salt通常比password短(如4个字符的salt和8个字符的password),因此攻击速度更快。

    哈希结果越长,并不一定意味着哈希计算所需的时间越长。实际上,许多散列算法只是作为事实上的标准才被接受,因为它们是可以高效实现的。例如,增加计算时间可以通过键派生函数(应用哈希1000次)来完成,但问题是选择预加盐是否有特定的原因。感谢关于块长度的提示,我甚至没有想到这一点。我猜这意味着对于像SHA-1(512位=64字节块)这样的加密散列,在预加/追加salt(除非salt大于64字节)方面没有区别,对吧?!SHA-1的大小仅为160位/20字节。我并没有说我对SHA1的理解是否有差异。但在我看来,SHA1(salt+pw)和SHA1(pw+salt)都是同样错误的。我检查了一个SHA-1实现,它实际上只在一个64字节的数据块满后才进行块处理,即我的技巧不适用于短数据,如密码。谢谢你指出这一点。可能是