Java服务器授权+授权工具部分代码及思路

目标:

项目部署到服务器上,需要当前服务器授权后才能正常访问,控制项目授权日期、(某终端/通道)授权数量、用户登录访问菜单权限

注:

授权端:授权工具在自己手里,控制授权,在此我称之为授权工具

被授权端:jar包部署的服务器端,在此我称之为服务器

思路:

使用RSA-2048非对称加密方式,生成两对公钥私钥,公钥加密、私钥解密。

A公钥加密服务器的硬件信息生成机器码,

授权工具端通过上传A私钥文件解密服务器机器码。

获取到服务器硬件信息,再拼接有效日期、终端授权数量、菜单权限,授权工具端通过B公钥加密拼接内容生成授权License文件和授权记录(日志)文件。

服务器通过上传授权License文件,获取授权,使用时,通过B私钥解密并解析服务器硬件信息、有效日期、终端授权数量、菜单权限

步骤:

生成公钥私钥:

import sun.misc.BASE64Encoder;

import java.io.File;
import java.io.IOException;
import java.security.*;

/**
 * @Author: Ocean
 * @Date: 2021/4/7 15:27
 */
public class KeyPairGenarete {
    /** 算法名称 */
    private static final String ALGORITHM = "RSA";
    /** 密钥长度 */
    private static final int KEY_SIZE = 2048;

    public static void main(String[] args) throws Exception {
        // 随机生成一对密钥(包含公钥和私钥)
        KeyPair keyPair = KeyPairGenarete.generateKeyPair();
        // 获取 公钥 和 私钥
        PublicKey pubKey = keyPair.getPublic();
        PrivateKey priKey = keyPair.getPrivate();

        // 保存 公钥 和 私钥
        KeyPairGenarete.saveKeyForEncodedBase64(pubKey, Constants.CLIENTPUBLICKEY_FILEPATH);
        KeyPairGenarete.saveKeyForEncodedBase64(priKey, Constants.CLIENTPRIVATEKEY_FILEPATH);
    }
    /**
     * 随机生成密钥对(包含公钥和私钥)
     * @return
     */
    public static KeyPair generateKeyPair() throws Exception {
        // 获取指定算法的密钥对生成器
        KeyPairGenerator gen = KeyPairGenerator.getInstance(ALGORITHM);

        // 初始化密钥对生成器(指定密钥长度, 使用默认的安全随机数源)
        gen.initialize(KEY_SIZE);

        // 随机生成一对密钥(包含公钥和私钥)
        return gen.generateKeyPair();
    }

    /**
     * 将 公钥/私钥 编码后以 Base64 的格式保存到指定文件
     * @param key
     * @param keyFile
     * @throws IOException
     */
    public static void saveKeyForEncodedBase64(Key key, String keyFile) throws IOException {
        // 获取密钥编码后的格式
        byte[] encBytes = key.getEncoded();

        // 转换为 Base64 文本
        String encBase64 = new BASE64Encoder().encode(encBytes);

        // 保存到文件
        IOUtils.writeFile(encBase64, new File(keyFile));
    }


}

A公钥加密服务器的硬件信息生成机器码、前端通过接口复制机器码:

提供四种硬件信息可以随意选取拼接

package com.vikor.gateway.utils.license;

import org.springframework.beans.factory.annotation.Value;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileWriter;
import java.io.InputStreamReader;

import static com.vikor.gateway.utils.license.Constants.CTClientPublicKey;
import static com.vikor.gateway.utils.license.Constants.CTServerPrivateKey;

/**
 * @Author: Ocean
 * @Date: 2021/3/30 14:54
 */
public class LicenseCode {

    /**
     * 获取机器码
     * @param no 硬件信息
     * @return 加密后的硬件信息
     */
    public static String getApplyCode(String no){
        try {//通过硬件信息+A公钥=加密后的硬件信息
            return RsaKey.Encrypt(no,CTClientPublicKey);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "缺少生成机器码相关文件";
    }

    /**
     * 拼接硬件信息字符串,用其他方式拼接也可以

     * @return
     */
    public static String getBaseCode(){
        //cpu
        String CPU = getCPUSerial();
        //主板
        String boardSN = getMotherboardSN();

        StringBuilder sb = new StringBuilder(100);
        //硬件信息
        sb.append(CPU).append(",")
                .append(board
  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个示例的Java服务器信息监控工具类的代码: ```java import java.lang.management.ManagementFactory; import java.lang.management.MemoryMXBean; import java.lang.management.OperatingSystemMXBean; import java.lang.management.RuntimeMXBean; import java.net.InetAddress; import java.net.UnknownHostException; public class ServerMonitor { public static void main(String[] args) { System.out.println("服务器信息监控开始:"); printServerInfo(); System.out.println("服务器信息监控结束。"); } public static void printServerInfo() { try { // 获取本地主机名和IP地址 InetAddress localHost = InetAddress.getLocalHost(); System.out.println("主机名:" + localHost.getHostName()); System.out.println("IP地址:" + localHost.getHostAddress()); } catch (UnknownHostException e) { System.out.println("无法获取主机信息:" + e.getMessage()); } // 获取操作系统信息 OperatingSystemMXBean osBean = ManagementFactory.getOperatingSystemMXBean(); System.out.println("操作系统:" + osBean.getName()); System.out.println("系统架构:" + osBean.getArch()); System.out.println("系统版本:" + osBean.getVersion()); System.out.println("可用处理器数目:" + osBean.getAvailableProcessors()); // 获取内存信息 MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean(); System.out.println("总内存:" + memoryBean.getHeapMemoryUsage().getMax()); System.out.println("已使用内存:" + memoryBean.getHeapMemoryUsage().getUsed()); // 获取运行时信息 RuntimeMXBean runtimeBean = ManagementFactory.getRuntimeMXBean(); System.out.println("Java虚拟机版本:" + runtimeBean.getVmVersion()); System.out.println("Java虚拟机厂商:" + runtimeBean.getVmVendor()); System.out.println("Java虚拟机名称:" + runtimeBean.getVmName()); } } ``` 这个示例代码通过使用Java的ManagementFactory类提供的API获取服务器的一些基本信息,包括主机名和IP地址、操作系统信息、内存信息以及Java虚拟机信息。你可以根据自己的需求进行扩展和修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值