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_Authentication_Hash_Cryptography_Salt - Fatal编程技术网

Security 你把盐串放在哪里?

Security 你把盐串放在哪里?,security,authentication,hash,cryptography,salt,Security,Authentication,Hash,Cryptography,Salt,在对数据库存储的密码进行哈希运算时,我总是使用正确的每项salt字符串。出于我的需要,将salt存储在哈希密码旁边的DB中一直都很好 然而,有些人建议将盐与数据库分开存储。他们的论点是,如果数据库遭到破坏,攻击者仍然可以构建一个彩虹表,将特定的salt字符串考虑在内,以便一次破解一个帐户。如果这个帐户有管理员权限,那么他甚至不需要破解任何其他帐户 从安全角度来看,在不同的地方储存盐是否值得?考虑在同一台机器上具有服务器代码和DB的Web应用程序。如果盐存储在该机器上的平面文件中,那么如果数据库被

在对数据库存储的密码进行哈希运算时,我总是使用正确的每项salt字符串。出于我的需要,将salt存储在哈希密码旁边的DB中一直都很好

然而,有些人建议将盐与数据库分开存储。他们的论点是,如果数据库遭到破坏,攻击者仍然可以构建一个彩虹表,将特定的salt字符串考虑在内,以便一次破解一个帐户。如果这个帐户有管理员权限,那么他甚至不需要破解任何其他帐户

从安全角度来看,在不同的地方储存盐是否值得?考虑在同一台机器上具有服务器代码和DB的Web应用程序。如果盐存储在该机器上的平面文件中,那么如果数据库被破坏,盐文件也将被破坏


有什么推荐的解决方案吗?

rainbow表的要点是,它们是预先创建的,并整体分发,以节省其他人的计算时间-动态生成rainbow表所需的时间与直接破解密码+salt组合所需的时间一样长(因为生成彩虹表时所做的实际上是预先运行暴力强制散列的计算),因此,通过知道盐有人可以“生成彩虹表”的说法是错误的


将salt存储在一个单独的文件中没有任何实际意义,只要它们是基于每个用户的——salt的意义仅仅是使一个rainbow表不能破坏数据库中的每个密码。

通常,它们被预先添加到散列中并存储在同一字段中

没有必要单独存储它们——关键是对每个密码使用随机salt,这样单个彩虹表就不能用于整个密码散列。使用随机salt,攻击者必须单独强制每个散列(或为所有可能的salt计算彩虹表,工作量大得多)

如果您有一个更安全的存储位置,那么将散列存储在那里是有意义的。

我将对此提供一个稍微不同的理解

我总是把盐和盐渍密码散列混合在一起储存

例如,我将把盐的前半部分放在密码的盐哈希之前,将盐的后半部分放在密码的盐哈希之后。应用程序知道这种设计,因此可以获取此数据,并获得盐和盐密码哈希

我对这种方法的理由:

如果密码/散列数据被泄露并落入攻击者手中,攻击者将无法通过查看数据来了解salt是什么。这样,攻击者实际上无法执行暴力攻击以获得与散列匹配的密码,因为他不知道散列的起始位置,也无法知道salt的哪些部分f数据是salt的一部分,或salt密码散列的一部分(,除非他知道应用程序的身份验证逻辑)

如果salt密码散列按原样存储,则可以执行蛮力攻击以获取密码,该密码在salt和散列时生成与salt密码散列相同的数据

但是,例如,即使salted password hash按原样存储,但使用单个随机字节挂起,只要攻击者不知道要丢弃第一个字节,这也会增加攻击难度。当用于验证用户身份时,应用程序将知道丢弃数据的第一个字节

这方面的结论。

1) 永远不要以完全相同的形式存储身份验证应用程序使用的数据

2) 如果可能,请为您的身份验证逻辑保密,以增加安全性

更进一步。

如果您不能对应用程序的身份验证逻辑保密,那么很多人都知道您的数据是如何存储在数据库中的。假设您决定将salt密码散列与salt混合存储在一起,其中一些salt在salt密码散列的前面,其余的salt在其后面

生成随机盐时,您还可以随机决定盐密码散列之前/之后要存储的盐的比例

例如,生成512字节的随机salt。将salt附加到密码中,并获取salt密码的SHA-512哈希。您还将生成一个随机整数200。然后存储salt的前200字节,然后是salt密码哈希,然后是salt的其余部分

当验证用户的密码输入时,应用程序将传递字符串,并假定数据的前1字节是salt的前1字节,后跟salt散列。这张通行证将失败。应用程序将继续使用数据的前2个字节作为salt的前2个字节,并重复此操作,直到在使用前200个字节作为salt的前200个字节后发现阳性结果。如果密码错误,应用程序将继续尝试所有排列,直到找不到为止

这种方法的优点是:

提高了安全性-即使您的身份验证逻辑已知,在编译时也不知道确切的逻辑。即使知道确切的逻辑,也几乎不可能执行暴力攻击。增加盐的长度将进一步提高安全性

这种方法的缺点是:

由于精确的逻辑是在运行时推断的,因此这种方法非常占用CPU。盐的长度越长,这种方法的CPU密集度就越高

验证不正确的密码将涉及最高的CPU成本。这可能会对合法请求产生反作用,但会提高针对攻击者的安全性

这种方法可以在v中实现
 userPassword + salt
 hash(userPassword+salt)
 hash(userPassword+salt)=ashdjdaskhfjdkhfjdashadslkhfdsdh
salt = "california"
passwd = "wp8tJ4Pr"

stored_passwd = salt + hash(passwd + salt)

salt = substr(stored_passwd, 0, 10)
hashed_passwd = substr(stored_passwd, 10, 40)

if hash(user_input + salt) == hashed_passwd:
    print "password is verified"