java获取mac和机器码,注册码的实现

本文介绍了一种使用Java获取计算机MAC地址等硬件信息的方法,并通过这些信息生成唯一的机器码及相应的注册码。该过程涉及了网络接口的读取、MD5加密算法的应用以及字符串处理技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package util;
import java.net.NetworkInterface;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Properties;
import java.util.Set;
import org.hyperic.sigar.NetFlags;
import org.hyperic.sigar.NetInterfaceConfig;
import org.hyperic.sigar.Sigar;
import org.hyperic.sigar.SigarException;
import org.springframework.security.authentication.encoding.Md5PasswordEncoder;

/**
 * java获取mac和机器码,注册码的实现
 * 
 */
public class AuthorizationUtils {
	private static final int SPLITLENGTH = 4;
	private static final String SALT = "yunshouhu";

	public static void main(String args[]) throws Exception {
		String code = getMachineCode();

		System.out.println("code:" + code);

		String authCode = auth(code);
		System.out.println("机器码:" + code);
		System.out.println("注册码:" + authCode);

		// System.out.println("mac:"+getMac());
		// System.out.println("mac2:"+getMac2());

	}

	private static String getMachineCode() {
		Set<String> result = new HashSet<>();
		String mac = getMac();
		System.out.println("mac:" + getMac());
		result.add(mac);
		Properties props = System.getProperties();
		String javaVersion = props.getProperty("java.version");
		result.add(javaVersion);
		// System.out.println("Java的运行环境版本:    " + javaVersion);
		String javaVMVersion = props.getProperty("java.vm.version");
		result.add(javaVMVersion);
		// System.out.println("Java的虚拟机实现版本:    " +
		// props.getProperty("java.vm.version"));
		String osVersion = props.getProperty("os.version");
		result.add(osVersion);
		// System.out.println("操作系统的版本:    " + props.getProperty("os.version"));

		String code = new Md5PasswordEncoder().encodePassword(
				result.toString(), SALT);
		return getSplitString(code, "-", 4);

	}

	// 使用hyperic-sigar获取mac
	private static String getMac2() throws SigarException {
		Sigar sigar = new Sigar();
		String[] ifaces = sigar.getNetInterfaceList();
		for (String iface : ifaces) {
			NetInterfaceConfig cfg = sigar.getNetInterfaceConfig(iface);
			if (NetFlags.LOOPBACK_ADDRESS.equals(cfg.getAddress())
					|| (cfg.getFlags() & NetFlags.IFF_LOOPBACK) != 0
					|| NetFlags.NULL_HWADDR.equals(cfg.getHwaddr())) {
				continue;
			}
			String mac = cfg.getHwaddr();
			return mac;
		}
		return null;

	}

	public static String auth(String machineCode) {
		String newCode = "(yunshouhuxxx@gmail.com)["
				+ machineCode.toUpperCase() + "](xxx应用级产品开发平台)";
		String code = new Md5PasswordEncoder().encodePassword(newCode, SALT)
				.toUpperCase() + machineCode.length();
		return getSplitString(code);
	}

	private static String getSplitString(String str) {
		return getSplitString(str, "-", SPLITLENGTH);
	}

	private static String getSplitString(String str, String split, int length) {
		int len = str.length();
		StringBuilder temp = new StringBuilder();
		for (int i = 0; i < len; i++) {
			if (i % length == 0 && i > 0) {
				temp.append(split);
			}
			temp.append(str.charAt(i));
		}
		String[] attrs = temp.toString().split(split);
		StringBuilder finalMachineCode = new StringBuilder();
		for (String attr : attrs) {
			if (attr.length() == length) {
				finalMachineCode.append(attr).append(split);
			}
		}
		String result = finalMachineCode.toString().substring(0,
				finalMachineCode.toString().length() - 1);
		return result;
	}

	public static String bytesToHexString(byte[] src) {
		StringBuilder stringBuilder = new StringBuilder("");
		if (src == null || src.length <= 0) {
			return null;
		}
		for (int i = 0; i < src.length; i++) {
			int v = src[i] & 0xFF;
			String hv = Integer.toHexString(v);
			if (hv.length() < 2) {
				stringBuilder.append(0);
			}
			stringBuilder.append(hv);
		}
		return stringBuilder.toString();
	}

	// ‎00-24-7E-0A-22-93
	private static String getMac() {
		try {
			Enumeration<NetworkInterface> el = NetworkInterface
					.getNetworkInterfaces();
			while (el.hasMoreElements()) {
				byte[] mac = el.nextElement().getHardwareAddress();
				if (mac == null)
					continue;

				String hexstr = bytesToHexString(mac);
				return getSplitString(hexstr, "-", 2).toUpperCase();

			}
		} catch (Exception exception) {
			exception.printStackTrace();
		}
		return null;
	}
}

### Java机器码的生成与校验 在 Java 开发中,机器码通常用于绑定特定设备或用户环境。通过生成唯一的机器码并对其进行验证,可以有效防止未经授权的访问或其他非法行为。 #### 1. 机器码的定义与组成 机器码通常是基于硬件信息(如 MAC 地址、CPU 序列号、硬盘序列号等)或者软件运行环境的信息组合而成的一串唯一字符串。为了增强安全性,还可以加入时间戳或者其他随机因子[^3]。 #### 2. 机器码的生成逻辑 以下是生成机器码的一个简单示例: ```java import java.net.InetAddress; import java.net.NetworkInterface; public class MachineCodeGenerator { public static String generateMachineCode() throws Exception { StringBuilder machineCode = new StringBuilder(); // 获取本地主机名 InetAddress ip = InetAddress.getLocalHost(); machineCode.append(ip.getHostName()); // 获取MAC地址 NetworkInterface network = NetworkInterface.getByInetAddress(ip); byte[] mac = network.getHardwareAddress(); for (int i = 0; i < mac.length; i++) { machineCode.append(String.format("%02X", mac[i])); } // 可以扩展其他硬件信息,比如 CPU ID 或者磁盘序列号 return machineCode.toString(); } } ``` 上述代码片段展示了如何从网络接口获取 MAC 地址,并将其作为部分机器码的内容。实际应用中可以根据需求增加更多字段,例如操作系统版本、处理器型号等。 #### 3. 机器码的加密处理 为了避免明文传输带来的安全隐患,在发送给服务器之前应对机器码进行加密处理。推荐使用标准算法如 SHA-256 进行哈希计算: ```java import java.security.MessageDigest; import java.nio.charset.StandardCharsets; public class HashUtil { public static String hashString(String input) throws Exception { MessageDigest digest = MessageDigest.getInstance("SHA-256"); byte[] encodedhash = digest.digest(input.getBytes(StandardCharsets.UTF_8)); StringBuilder hexString = new StringBuilder(); for (byte b : encodedhash) { String hex = Integer.toHexString(0xff & b); if (hex.length() == 1) hexString.append('0'); hexString.append(hex); } return hexString.toString(); } } ``` 此工具类提供了将任意字符串转换成固定长度散列值的功能,适用于保护敏感数据的安全性[^1]。 #### 4. 服务端校验流程 当客户端提交请求时携带已加密过的机器码至后台,则需按照相同规则重新构建预期结果并与之对比确认一致性。如果两者匹配则视为合法连接;反之拒绝访问权限。 注意:由于不同平台间可能存在差异因此建议尽可能多地收集特征项以便提高兼容性准确性同时也要考虑到隐私政策合规方面的要求[^2]。 --- ###
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值