密码安全之动态盐

1 篇文章 0 订阅
1 篇文章 0 订阅

首先,我们看看什么是盐:http://zh.wikipedia.org/zh/%E7%9B%90_%28%E5%AF%86%E7%A0%81%E5%AD%A6%29

通常情况下,当字段经过散列处理(如MD5),会生成一段散列值,而散列后的值一般是无法通过特定算法得到原始字段的。但是某些情况,比如一个大型的彩虹表,通过在表中搜索该MD5值,很有可能在极短的时间内找到该散列值对应的真实字段内容。

加盐后的散列值,可以极大的降低由于用户数据被盗而带来的密码泄漏风险,即使通过彩虹表寻找到了散列后的数值所对应的原始内容,但是由于经过了加盐,插入的字符串扰乱了真正的密码,使得获得真实密码的概率大大降低。

但是很多人没意识到的是静态盐仍然不够安全。因为静态盐要面临两种攻击:

1,基于特定的静态盐,可以生成特定的彩虹表.

2,对静态盐处理过的散列密码,可以按出现频率进行排序,最常出现的散列密码,对应的明文密码必然还是那些111111、123456之类的。


因此,对于重要的账号密码,我们需要采用动态盐来对密码进行混淆。一个常用做法就是把账号名进行MD5之后,作为动态盐。则上述两种攻击将失效。

比如,用户名是wsq,对应的md5是4572381974328f9c作为动态盐,密码是123456,加上动态盐之后为4572381974328f9c123456,再MD5是d16e970d6e5b95b9。则最终的计算结果是无法猜测的(unguessable)


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在Java中生成密码是为了增强密码安全性,一般会将密码值进行混合后再加密存储。以下是一种常见的Java密码生成方法: 1. 首先,生成一个随机的值字符串。可以使用Java的SecureRandom类生成一个安全的随机数作为。例如: ``` SecureRandom random = new SecureRandom(); byte[] saltBytes = new byte[16]; random.nextBytes(saltBytes); String salt = Base64.getEncoder().encodeToString(saltBytes); ``` 2. 将密码值进行混合。可以使用Java的String类的concat方法将密码值连接在一起。例如: ``` String password = "123456"; String saltedPassword = password.concat(salt); ``` 3. 对混合后的密码进行加密。常见的密码加密算法有MD5、SHA等。可以使用Java的MessageDigest类进行加密。例如: ``` MessageDigest digest = MessageDigest.getInstance("SHA-256"); byte[] hashedBytes = digest.digest(saltedPassword.getBytes(StandardCharsets.UTF_8)); ``` 4. 将加密后的密码存储在数据库或其他持久化存储中,同时也要存储值。 在验证密码时,使用同样的值对用户输入的密码进行相同的操作,然后将结果与存储的加密后的密码进行比较。如果结果一致,则密码正确。 密码生成是一种增加密码安全性的方法,在存储和验证密码时都需要使用相同的值和加密算法。这样即使相同的密码在不同用户间被使用,也能得到不同的加密结果,提高了密码安全性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值