jwt私钥签名公钥解析

jwt私钥签名公钥解析

丁起男 178 2022-03-24

jwt私钥签名公钥解析

一般我们使用jwt绝大多少情况都是使用的诸如hs256之类的签名和解析使用同一密钥的算法,这样做的好处是操作简单可以满足级别的使用。但是如果你是独立的授权服务器,你签名的jwt要给其他服务使用,这样就应该让jwt只有自己可以签发,其他服务只能解析,这样就需要使用公钥私钥的模式了

本文代码基于hutool,算法使用rs256

创建公钥私钥

//使用rsa算法
KeyPair pair = SecureUtil.generateKeyPair("RSA");
//将公钥和私钥进行base64编码,以方便使用
System.out.println(Base64.encode(pair.getPublic().getEncoded()));
System.out.println(Base64.encode(pair.getPrivate().getEncoded()));

我们使用私钥进行签名,公钥来解析。可以把公钥对外暴露出去给其他服务使用,自己保留私钥,这样就只有自己可以进行签名了

使用

        //模拟数据
        Map<String,Object> map = new HashMap<>(){{
            put("uid",123);
            put("exp_time",System.currentTimeMillis()+1000*60*60);
        }};
        //密钥字符串
        String publicKeyStr = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDLmoI1anuYg6Pd5ct1NLF/v081bDxFUjuwhClIs4W94z05Uh6m0VJV3U5Vq4f/2csAnfvWH8+kkHOxhl0GmM/rlkKqc9l6cLOHHrSjXn0uiDVfVVUC8Bs/domH24bBVUL8TTmoHi0VHIbZBEHJozFdT7eGREVLXrlnVuLbuHYaAwIDAQAB";
        String privateKeyStr = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAMuagjVqe5iDo93ly3U0sX+/TzVsPEVSO7CEKUizhb3jPTlSHqbRUlXdTlWrh//ZywCd+9Yfz6SQc7GGXQaYz+uWQqpz2Xpws4cetKNefS6INV9VVQLwGz92iYfbhsFVQvxNOageLRUchtkEQcmjMV1Pt4ZERUteuWdW4tu4dhoDAgMBAAECgYBjC8+C/8GPgJ6TYGoZIuCkViNIyFYLnQT3iltxCBAsP2L1wxqxKUwmBCpK586ZqtAkBTbRRBllo3X8qvIPNwCR6vKtBIhO+NQSMJNoOkENuwFMpvJSvNAkYYv2WgcmE+Jhzckc0UQDuK9O+XGy8XmT2ZBHs5G1iziSpTYp57l6fQJBAO2Axk6JfqgLhRnbleGTbHZDDcBWvsUoZ+LOf9jvZ2TdIiJYBoNYwW3nvUUfLLv3vj/ekarzYNaEItYJkalUO48CQQDbddym/4Fmyh444j+Rb1Mnp5rQstJI8ttKECOnDmY6ccNICsI9Fm2CFp8mtZkdpX19CvVhBjPus+O6BqschNBNAkBESFO7XLh3Y+h+iK1Mz2/NiHW5qLbsRDOp96i2HA5j51fa++fTd38VNB0sdEwONqoR/tFujs52nkLNuq6QOlFtAkB78LBQz/OwrW0sCvqDlC+OMaXJP3RrJlyaE0tPSV6Kmz0CLrFL9qKZ2VTAc8apa5DXUZ0K0on5wTZXFPUGAivxAkEAk0M/Hk5aK1sK/qTBY9zk2gTSC+i1cLW9PiN3rZ4BvF8B+Us7svdK+BBXGmwwpt9XkwKwvw+ZcVkvyc/i75u4eg==";
        //公钥和私钥
        PublicKey publicKey = KeyUtil.generatePublicKey(AsymmetricAlgorithm.RSA_ECB_PKCS1.getValue(), Base64.decode(publicKeyStr));
        PrivateKey privateKey = KeyUtil.generateRSAPrivateKey(Base64.decode(privateKeyStr));

        JWTSigner privateSigner = JWTSignerUtil.rs256(privateKey);
        JWTSigner publicSigner = JWTSignerUtil.rs256(publicKey);
        //私钥签名
        String token = JWTUtil.createToken(map, privateSigner);
        System.out.println(token);
        //System.out.println(new String(Base64.decode(token)));
        //公钥解析
        boolean verify = JWTUtil.verify(token, publicSigner);
        System.out.println(verify);

        JWT jwt = JWTUtil.parseToken(token);
        System.out.println(jwt.getPayload().getClaim("uid"));