密码加密之salt(加盐)

摘自:维基百科

(Salt),在密码学中,是指通过在密码任意固定位置插入特定的字符串,让散列后的结果和使用原始密码的散列结果不相符,这种过程称之为“加盐”。


安全因素


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

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

实现原理

加盐的实现过程通常是在需要散列的字段的特定位置增加特定的字符,打乱原始的字串,使其生成的散列结果产生变化。比如,用户使用了一个密码:

x7faqgjw

经过MD5散列后,可以得出结果:

455e0e5c2bc109deae749e7ce0cdd397

但是由于用户密码位数不足,短密码的散列结果很容易被彩虹表破解,因此,在用户的密码末尾添加特定字串(绿色字体为加盐的字段):

x7faqgjwabcdefghijklmnopqrstuvwxyz

因此,加盐后的密码位数更长了,散列的结果也发生了变化:

4a1690d5eb6c126ef68606dda68c2f79

以上就是加盐过程的简单描述,在实际使用过程中,还需要通过特定位数插入、倒序或多种方法对原始密码进行固定的加盐处理,使得散列的结果更加不容易被破解或轻易得到原始密码,比如(绿色字体为加盐字串):

x7afabqgcjw


在Java中使用MD5加密密码加盐可以通过以下步骤实现: 1. 导入相关的库和类。首先,需要导入java.security包中的MessageDigest类,该类提供了MD5加密的方法。 2. 创建一个方法来进行MD5加密。可以创建一个名为`encryptPassword`的方法,并传入两个参数:密码和盐值。方法的返回值应该是加密后的密码。 3. 在方法中对密码和盐值进行拼接。可以使用字符串的加法操作符将密码和盐值拼接在一起。 4. 创建一个MessageDigest对象,使用 getInstance("MD5")方法获取该对象。MessageDigest类提供了MD5加密算法的实现。 5. 使用MessageDigest对象对拼接后的字符串进行加密。可以调用`digest()`方法对字符串进行加密,该方法返回一个字节数组。 6. 将加密后的字节数组进行转换。可以使用`DatatypeConverter`类提供的`printHexBinary()`方法将字节数组转换成十六进制字符串。 7. 将转换后的字符串作为加密后的密码返回。 下面是一个示例代码片段: ```java import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class MD5SaltExample { public static String encryptPassword(String password, String salt) { String saltedPassword = password + salt; try { MessageDigest md = MessageDigest.getInstance("MD5"); byte[] hashedPassword = md.digest(saltedPassword.getBytes()); // Convert byte array to hex string StringBuilder sb = new StringBuilder(); for (byte b : hashedPassword) { sb.append(String.format("%02x", b)); } return sb.toString(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return ""; } public static void main(String[] args) { String password = "example"; String salt = "somesalt"; String encryptedPassword = encryptPassword(password, salt); System.out.println("Encrypted password: " + encryptedPassword); } } ``` 在上述代码中,我们首先将密码和盐值拼接在一起,然后使用MessageDigest类提供的`digest()`方法进行加密加密后的字节数组将被转换成十六进制字符串,并以字符串形式返回。在main方法中,我们将输入的密码和盐值传递给`encryptPassword`方法,并打印加密后的密码
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值