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

本文介绍了使用RSA-2048加密实现的服务器授权方案。通过生成的公钥私钥对,A公钥加密服务器硬件信息生成机器码,授权工具使用A私钥解密获取信息,再结合有效日期、授权数、菜单权限,使用B公钥加密生成授权文件。服务器上传授权文件后,通过B私钥解密验证授权。

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

目标:

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

注:

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

被授权端: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 =
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值