salt值(盐值)

文章讲述了SALT值在密码保护中的重要性,它是用来增强密码哈希安全性的一种方法。当用户注册时,系统生成随机的SALT值与密码结合,增加密码的复杂性,使相同的密码加密后得到不同的密文,提高黑客破解的难度。在密码校验时,系统会使用相同的SALT值再次加密,对比密文以验证密码的正确性。盐值应使用安全随机数生成且不应固定,以增强安全性。

SALT值属于随机值。用户注册时,系统用来和用户密码进行组合而生成的随机数值,称作salt值,通称为加盐值。

1、背景:系统通常把用户的密码如MD5加密后,以密文形式保存在数据库中,来防止黑客偷窥。

2、产生:随着对MD5密文查询工具的出现,而很多用户的密码又设置简单,单纯的对用户密码进行MD5加密后保存,用密文很容易就能反查询得到某用户的密码。

3、原理:为用户密码添加Salt值,使得加密的得到的密文更加冷僻,不宜查询。即使黑客有密文查询到的值,也是加了salt值的密码,而非用户设置的密码。salt值是随机生成的一组字符串,可以包括随机的大小写字母、数字、字符,位数可以根据要求而不一样。

4、用途:当用户首次提供密码时(通常是注册时),由系统自动添加随机生成的salt值,然后再散列。而当用户登录时,系统为用户提供的代码撒上同样的加盐值,然后散列,再比较散列值,已确定密码是否正确。

5、其它:经过添加salt值处理的密码,即使用户设置的原密码是相通的,数据库中的密文却是不同的。

引:

单向散列加密

                               salt

                                |

                                V                

-----明文---->  单向散列算法 ----->密文

为了加强单向散列计算的安全性,会给散列算法加点盐(salt),salt相当于加密的密钥,增加破解的难度。常用的单向散列算法有MD5、SHA等。

单向散列算法还有一个特点就是输入的任何微小变化都会导致输出的完全不同,这个特性有时也会被用来生成信息摘要、计算具有高离散程度的随机数等用途。

关于盐值的理解

密码哈希
  哈希算法任何数量的数据转换为无法反转的固定长度的“指纹”。即使原始输入的数据变化很小,但是其输出的结果相差很大。

     Hash(“hello”)= 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b98

     Hash(“hallo”)= 8756879c05c68dfac9866712fad6a93f8146f337a69afe7dd238ff3f9e94bc3

  使用哈希之后,如何校验用户的用户名密码呢?
    用户创建一个帐户时。输入的密码被散列并存储在数据库中。

    当用户登录时,对其输入的密码散列,对照其实际密码(从数据库检索)。

    如果哈希匹配,则授予用户访问权限。如果不是,则告诉用户他们输入了无效的登录凭

    常用的较为安全的密码哈希算法:SHA256,SHA512,等。

2 破解密码

  因为哈希算法,相同的输入时,会有一个相同的输出值。由此就出现了几种破解方法:

2.1字典和蛮力攻击

  这是最简单的密码猜解方法,对每个值进行哈希,然后与数据库泄露出的密码哈希值进行对比,如果相同,代表着密码被猜解。

  字典攻击:使用的字典一般含单词,词组,常用密码以及其他可能用作密码的字符串。

  蛮力攻击: 尝试所有可能的字符组合。

  虽然如果密码长度够长、复杂度较高,会给破解带来一些难度,但是没有办法完全阻止。

2.2 查找表

    查找表的思路是字典中,首先预置好哈希值。然后将实际密码的哈希值与之搜索对比。这是一种非常有效的方法,可以非常快速地破解许多相同类型的哈希。

  2.3 反向查找表

  这种攻击特别有效,因为许多用户通常使用相同的密码。所以可以对某个字符进行哈希,然后去数据库中进行查询此哈希值映射的用户名。

  例如:

  在用户的哈希列表中搜索哈希(password1)...:匹配[小明,小花,小白]

  在用户的哈希列表中搜索哈希(password2)...:匹配[李明]

3 加盐值

  首先可以通过一个场景了解盐值的作用:

  1、小明要注册某个网站,注册时密码填写为password=123456。

  2、为了保证密码的复杂度,系统可以使用盐值。将小明输入的password和salt一起加密后存储。即最终存储的密码为:PASSWORD=123456+salt

  由于密码是由用户设定的,在实际应用中,用户设置的密码复杂度可能不够高,同时不同的用户极有可能会使用相同的密码,那么这些用户对应的密文也会相同,这样,当存储用户密码的数据库泄露后,攻击者会很容易便能找到相同密码的用户,从而也降低了破解密码的难度,因此,在对用户密码进行加密时,需要考虑对密码进行掩饰,即使是相同的密码,也应该要保存为不同的密文,即使用户输入的是弱密码,也需要考虑进行增强,从而增加密码被攻破的难度,而使用带盐的加密hash值便能满足该需求。

  3.1  加密存储

  输入: 密码字符串passWord

  输出:盐值 salt 、密码密文passWordHash

  可以将salt放到passWord前面作为前缀或放到passWord后面作为后缀得到新的字符串PS,即,PS = password和salt的组合串;

   密码密文passWordHash = Hash加密函数(PS );

3.2 密码校验

  输入: 密码字符串passWord

  输出:密码校验是否成功

  处理:

   1)、取出当前用户密码加密时使用的盐值salt

  2)、得到本次输入的密码passWordCur和盐值salt的组合字符串PS

  3)、得出本次输入密码的密文passWordHashCur= Hash加密函数(PS );

  4)、比较passWordHashCur和用户最初设置的密码密文passWordHash是否一致,如果一致,则校验成功,否则校验失败。

 

3.4 盐值的产生与存储

  盐值应该使用安全随机数生成;不能写死在代码中或者配置文件中、数据库中。而且对盐值的长度也应该有一定的要求,较短的盐值,仍然有被破解的风险。

 

在已知明文、对应的哈希以及所使用的哈希算法的情况下,求解可通过穷举法来尝试得到。是在哈希运算前添加到明文中以增强安全性的额外信息,哈希过程可表示为 `哈希 = H(明文 || )` ,这里的 `H` 代表所使用的哈希算法。 穷举法的基本思路是尝试所有可能的,然后将其与已知明文拼接,再使用给定的哈希算法进行哈希运算,把运算得到的结果和已知的哈希进行对比。如果两者一致,那么当前尝试的就是正确的。 以下是一个使用 Python 实现的示例代码: ```python import hashlib def find_salt(plaintext, hash_value, algorithm): # 假设是 ASCII 编码,且长度不超过 10 max_salt_length = 10 for length in range(1, max_salt_length + 1): import itertools # 生成所有可能的组合 for salt in itertools.product(range(32, 127), repeat=length): salt_str = ''.join(map(chr, salt)) # 拼接明文和 combined = plaintext + salt_str if algorithm == 'sha256': hash_object = hashlib.sha256(combined.encode()) elif algorithm == 'md5': hash_object = hashlib.md5(combined.encode()) # 可以添加更多的哈希算法 new_hash = hash_object.hexdigest() if new_hash == hash_value: return salt_str return None # 示例使用 plaintext = "example" hash_value = "这里填入实际的哈希" algorithm = "sha256" salt = find_salt(plaintext, hash_value, algorithm) if salt: print(f"找到的是: {salt}") else: print("未找到合适的。") ``` 需要注意的是,此方法的效率较低,尤其是长度较长或者字符集较大时,所需的计算量会非常大。此外,上述代码仅考虑了 ASCII 字符集且长度不超过 10 个字符,如果实际情况不同,需要对代码进行相应调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java小王子呀

您的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值