Springboot整合JwtHelper实现非对称加密

 更新时间:2022年03月31日 12:14:31   作者:Love is beautiful  
本文主要介绍了Springboot整合JwtHelper实现非对称加密,主要介绍两种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、生成公私钥对

提供两种方法,一种基于命令行中的Keytool工具生成,一种是基于SpringSecurity中的KeyPairGenerator类生成,现实现第二种方式:

//    加密算法
    private static final String KEY_ALGORITHM = "RSA";
//    公钥key
    private static final String PUB_KEY="publicKey";
//    私钥key
    private static final String PRI_KEY="privateKey";
 
    public static Map<String,String> generateKey() throws NoSuchAlgorithmException {
        Map<String,String> keyMap=new HashMap<>();
        KeyPairGenerator instance = KeyPairGenerator.getInstance(KEY_ALGORITHM);
        KeyPair keyPair = instance.generateKeyPair();
        PrivateKey privateKey = keyPair.getPrivate();
        PublicKey publicKey = keyPair.getPublic();
        //Base64 编码
        byte[] privateKeyEncoded = privateKey.getEncoded();
        String privateKeyStr = Base64.encodeBase64String(privateKeyEncoded);
        byte[] publicKeyEncoded = publicKey.getEncoded();
        String publicKeyStr=Base64.encodeBase64String(publicKeyEncoded);
        keyMap.put(PUB_KEY,publicKeyStr);
        keyMap.put(PRI_KEY,privateKeyStr);
        return keyMap;
    }

二、利用私钥生产token

 //    加密算法
    private static final String KEY_ALGORITHM = "RSA";
    //    公钥key
    private static final String PUB_KEY="publicKey";
    //    私钥key
    private static final String PRI_KEY="privateKey";
//    GenerateKey Key=new GenerateKey();
//    利用私钥生产token
    public static Map<String,String> generateToken(UserDetails userDetails) throws NoSuchAlgorithmException, InvalidKeySpecException {
        GenerateKey Key=new GenerateKey();
        RSAPrivateKey privateKey = null;
        RSAPublicKey publicKey=null;
        String token=null;
        Map<String, String> map=new HashMap<>();
        Map<String, String> keyMap = Key.generateKey();
        privateKey=getPrivateKey(keyMap.get(PRI_KEY));
        Map<String,String> tokenMap=new HashMap<>();
        tokenMap.put("userName",userDetails.getUsername());
//        使用私钥加密
        token = JwtHelper.encode(JSON.toJSONString(tokenMap), new RsaSigner(privateKey)).getEncoded();
 
 
        map.put("token",token);
        map.put("publicKey",keyMap.get(PUB_KEY));
        return map;
    }

三、利用公钥解密token

public static String parseToken(String token,String publicKey) throws NoSuchAlgorithmException, InvalidKeySpecException {
        Jwt jwt=null;
        RSAPublicKey rsaPublicKey;
        rsaPublicKey=getPublicKey(publicKey);
        jwt=JwtHelper.decodeAndVerify(token, new RsaVerifier(rsaPublicKey) );
        String claims= jwt.getClaims();
        return claims;
    }

四、将String类型的公钥转换成RSAPublicKey对象

    /**
     * 得到公钥
     *
     * @param publicKey
     *            密钥字符串(经过base64编码)
     * @throws Exception
     */
    public static RSAPublicKey getPublicKey(String publicKey) throws NoSuchAlgorithmException, InvalidKeySpecException {
        // 通过X509编码的Key指令获得公钥对象
        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
        X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(Base64.decodeBase64(publicKey));
        RSAPublicKey key = (RSAPublicKey) keyFactory.generatePublic(x509KeySpec);
        return key;
    }

五、将String类型的私钥转换成RSAPrivateKey对象

    /**
     * 得到私钥pkcs8
     *
     * @param privateKey
     *            密钥字符串(经过base64编码)
     * @throws Exception
     */
    public static RSAPrivateKey getPrivateKey(String privateKey)
            throws NoSuchAlgorithmException, InvalidKeySpecException {
        // 通过PKCS#8编码的Key指令获得私钥对象
        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
        PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKey));
        RSAPrivateKey key = (RSAPrivateKey) keyFactory.generatePrivate(pkcs8KeySpec);
        return key;
    }

到此这篇关于Springboot整合JwtHelper实现非对称加密的文章就介绍到这了,更多相关Springboot JwtHelper非对称加密内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 如何通过properties文件配置web.xml中的参数

    如何通过properties文件配置web.xml中的参数

    这篇文章主要介绍了如何通过properties文件配置web.xml中的参数方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Java实现八种排序算法详细代码举例

    Java实现八种排序算法详细代码举例

    排序问题一直是程序员工作与面试的重点,今天特意整理研究下与大家共勉!这篇文章主要介绍了Java实现八种排序算法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-10-10
  • Java设计模式之动态代理

    Java设计模式之动态代理

    今天小编就为大家分享一篇关于Java设计模式之动态代理,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • Java实现简单小画板

    Java实现简单小画板

    这篇文章主要为大家详细介绍了Java实现简单小画板,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • Spring AOP 创建代理对象详情

    Spring AOP 创建代理对象详情

    这篇文章介绍了Spring AOP 创建代理对象详情,主要介绍AOP 创建代理对象和上下文相关的内容,下文分享具有一定的参考价值,需要的小伙伴可以参考一下
    2022-05-05
  • 如何准确判断邮件地址是否存在

    如何准确判断邮件地址是否存在

    本文介绍了如何判断邮件地址是否存在的方法,具有很高的使用价值,提高了工作效率
    2015-07-07
  • 浅谈MyBatis Plus主键设置策略

    浅谈MyBatis Plus主键设置策略

    本文主要介绍了MyBatis Plus主键设置策略,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • 聊聊SpringBoot的@Scheduled的并发问题

    聊聊SpringBoot的@Scheduled的并发问题

    这篇文章主要介绍了聊聊SpringBoot的@Scheduled的并发问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Jedis出现connection timeout问题解决方法(JedisPool连接池使用实例)

    Jedis出现connection timeout问题解决方法(JedisPool连接池使用实例)

    这篇文章主要介绍了Jedis出现connection timeout问题解决方法,使用Jedis的JedisPool连接池解决了这个问题,需要的朋友可以参考下
    2014-05-05
  • Java连接mysql数据库代码实例程序

    Java连接mysql数据库代码实例程序

    这篇文章主要介绍了java连接mysql数据库代码实例程序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11

最新评论