java加盐算法

import java.security.MessageDigest;
import java.util.Random;

import org.apache.commons.codec.binary.Hex;

public class PasswordUtil {
/**
* 生成含有随机盐的密码
*/
public static String generate(String password) {
Random r = new Random();
StringBuilder sb = new StringBuilder(16);
sb.append(r.nextInt(99999999)).append(r.nextInt(99999999));
int len = sb.length();
if (len < 16) {
for (int i = 0; i < 16 - len; i++) {
sb.append(“0”);
}
}
String salt = sb.toString();
password = md5Hex(password + salt);
char[] cs = new char[48];
for (int i = 0; i < 48; i += 3) {
cs[i] = password.charAt(i / 3 * 2);
char c = salt.charAt(i / 3);
cs[i + 1] = c;
cs[i + 2] = password.charAt(i / 3 * 2 + 1);
}
return new String(cs);
}

/**
 * 校验密码是否正确
 */
public static boolean verify(String password, String md5) {
	char[] cs1 = new char[32];
	char[] cs2 = new char[16];
	for (int i = 0; i < 48; i += 3) {
		cs1[i / 3 * 2] = md5.charAt(i);
		cs1[i / 3 * 2 + 1] = md5.charAt(i + 2);
		cs2[i / 3] = md5.charAt(i + 1);
	}
	String salt = new String(cs2);
	return md5Hex(password + salt).equals(new String(cs1));
}

/**
 * 获取十六进制字符串形式的MD5摘要
 */
public static String md5Hex(String src) {
	try {
		MessageDigest md5 = MessageDigest.getInstance("MD5");
		byte[] bs = md5.digest(src.getBytes());
		return new String(new Hex().encode(bs));
	} catch (Exception e) {
		return null;
	}
}

public static void main(String[] args) {
	String password = generate("admin");
	System.out.println(verify("admin", password));
}

}
原文:https://blog.csdn.net/xiaocha2008/article/details/42872195

您好!您可以使用以下代码示例在Java中实现SM3算法加盐: ```java import org.bouncycastle.crypto.digests.SM3Digest; import org.bouncycastle.util.encoders.Hex; import java.nio.charset.StandardCharsets; import java.security.SecureRandom; public class SM3WithSalt { public static void main(String[] args) { String message = "Hello, World!"; byte[] salt = generateSalt(); // 生成随机盐 // 加盐前的消息摘要 byte[] digestWithoutSalt = sm3Digest(message.getBytes(StandardCharsets.UTF_8)); // 加盐后的消息摘要 byte[] digestWithSalt = sm3DigestWithSalt(message.getBytes(StandardCharsets.UTF_8), salt); System.out.println("加盐前的摘要: " + Hex.toHexString(digestWithoutSalt)); System.out.println("加盐后的摘要: " + Hex.toHexString(digestWithSalt)); } public static byte[] sm3Digest(byte[] input) { SM3Digest digest = new SM3Digest(); digest.update(input, 0, input.length); byte[] output = new byte[digest.getDigestSize()]; digest.doFinal(output, 0); return output; } public static byte[] sm3DigestWithSalt(byte[] input, byte[] salt) { SM3Digest digest = new SM3Digest(); digest.update(salt, 0, salt.length); digest.update(input, 0, input.length); byte[] output = new byte[digest.getDigestSize()]; digest.doFinal(output, 0); return output; } public static byte[] generateSalt() { byte[] salt = new byte[16]; // 盐的长度为16字节 SecureRandom random = new SecureRandom(); random.nextBytes(salt); return salt; } } ``` 此示例使用了 Bouncy Castle 加密库来实现 SM3 算法。首先,我们定义了两个方法 `sm3Digest` 和 `sm3DigestWithSalt`,用于计算不加盐加盐后的消息摘要。然后,我们使用 `generateSalt` 方法生成一个随机盐。最后,我们演示了如何在加盐前和加盐后对消息进行摘要计算,并将结果打印出来。 请确保您已经添加了 Bouncy Castle 加密库的依赖,可以通过 Maven 进行添加: ```xml <dependencies> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.69</version> </dependency> </dependencies> ``` 希望对您有所帮助!如果您有任何其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值