AES加密算法 生成token

package com.ty.qdd.utils;

import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.ty.qdd.pojo.po.app.UserInfoPO;
import com.ty.qdd.pojo.vo.app.userInfo.TokenVo;
import lombok.SneakyThrows;
import org.apache.tomcat.util.codec.binary.Base64;
import org.springframework.lang.NonNull;
import org.springframework.util.DigestUtils;

import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.SecureRandom;
import java.util.concurrent.TimeUnit;


public class TokenUtils {

    public final static String tokenHeader = "QDD-USER-TOKEN";

    // Base64 编码
    private static final Base64 base64 = new Base64();

    // AES加密算法
    private static final String AES_ALGORITHM = "AES";

    // AES加密算法秘钥
    private static final String aesSecretKey = "W7MBMBnSi2s9v5rHCXRh7c+ZDydR98atPnqVdQA+zlfUCQ==";


    /**
     * AES加密
     * @param content 需要加密的明文
     * @return 加密后的密文(str/key为null返回null)
     */
    public static String aesEncode(@NonNull String content) {
        return aesEncode(content,false);
    }

    /**
     * AES加密
     * @param content 需要加密的明文
     * @param urlSafety 密文是否需要Url安全
     * @return 加密后的密文(str/key为null返回null)
     */
    public static String aesEncode(@NonNull String content, boolean urlSafety) {
        try {
            KeyGenerator keyGenerator = KeyGenerator.getInstance(AES_ALGORITHM);
            keyGenerator.init(128, new SecureRandom(aesSecretKey.getBytes()));
            SecretKey secretKey = keyGenerator.generateKey();
            SecretKeySpec key = new SecretKeySpec(secretKey.getEncoded(), AES_ALGORITHM);
            Cipher cipher = Cipher.getInstance(AES_ALGORITHM);// 创建密码器
            byte[] byteContent = content.getBytes(StandardCharsets.UTF_8);
            cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化
            byte[] bytes = cipher.doFinal(byteContent);
            if (urlSafety) {
                return Base64.encodeBase64URLSafeString(bytes);
            }
            else {
                return new String(base64.encode(bytes));
            }
        }
        catch (Exception e) {
            System.err.println("AES加密失败, 明文:" + content + ", key:" + aesSecretKey + ", 错误:" + e.getMessage());
        }
        return null;
    }

    /**
     * AES解密
     * @param content 需要解密的密文(base64编码字符串)
     * @return 解密后的明文
     */
    public static String aesDecode(@NonNull String content) {
        return aesDecode(content,false);
    }

    /**
     * AES解密
     * @param content 需要解密的密文(base64编码字符串)
     * @param urlSafety 密文是否有Url安全
     * @return 解密后的明文
     */
    public static String aesDecode(@NonNull String content, boolean urlSafety) {
        try {
            KeyGenerator keyGenerator = KeyGenerator.getInstance(AES_ALGORITHM);
            keyGenerator.init(128, new SecureRandom(aesSecretKey.getBytes()));
            SecretKey secretKey = keyGenerator.generateKey();
            SecretKeySpec key = new SecretKeySpec(secretKey.getEncoded(), AES_ALGORITHM);
            Cipher cipher = Cipher.getInstance(AES_ALGORITHM);// 创建密码器
            cipher.init(Cipher.DECRYPT_MODE, key);// 初始化
            // 解密
            if (urlSafety){
                content = new String(cipher.doFinal(Base64.decodeBase64URLSafe(content)), StandardCharsets.UTF_8);
            }else {
                content = new String(cipher.doFinal(base64.decode(content)), StandardCharsets.UTF_8);
            }
            return content;
        } catch (Exception e) {
            System.err.println("AES解密失败, 密文:" + content + ", key:" + aesSecretKey + ", 错误:" + e.getMessage());
        }
        return null;
    }

    /**
     * 生成token
     * @param userInfoPO 用户信息
     * @param expire token时长
     * @param timeUnit 时间类型
     * @return 返回生成的token
     */
    @SneakyThrows
    public static synchronized String createToken(@NonNull UserInfoPO userInfoPO, @NonNull Integer expire, @NonNull TimeUnit timeUnit) {
        //开始时间
        long begin = System.currentTimeMillis();
        //过期时间
        long end = 0;
        switch (timeUnit){
            case SECONDS: {
                end = begin + expire * 1000;
                break;
            }
            case MINUTES: {
                end = begin + expire * 60 * 1000;
                break;
            }
            case HOURS: {
                end = begin + expire * 60 * 60 * 1000;
                break;
            }
            case DAYS: {
                end = begin + expire * 24 * 60 * 60 * 1000;
                break;
            }
            default: {
                end = begin + expire;
                break;
            }
        }
        //写入 TokenVo
        TokenVo tokenVo = new TokenVo(userInfoPO.getId(),userInfoPO.getUsername(),begin,end);
        //将实体类转化
        String token =  new ObjectMapper().writeValueAsString(tokenVo);
        //return new String(base64.encode(token.getBytes()));
        //AES加密返回
        return aesEncode(token,true);
    }

    /**
     * 对 token 进行解密,转化成 TokenVo
     * @param token
     * @return
     */
    public static synchronized TokenVo decodeToken(String token){
        return JSONObject.parseObject(aesDecode(token,true),TokenVo.class);
    }

    /**
     * 验证token是否存在或过期
     * @param token 值
     * @return 返回值
     */

    public static boolean validateToken_2(String token){
        if (!RedisUtils.exist(RedisUtils.LOGIN_USER_KEY + token)){
            return false;
        }
        return getEndTimeFromToken(token) >= System.currentTimeMillis();
    }

    /**
     * 通过 token 获取用户id
     * @param token 传入token
     * @return 返回用户名
     */
    public static Long getUserIdFromToken(String token){
        return decodeToken(token).getUserId();
    }

    /**
     * 通过 token 获取用户名
     * @param token 传入token
     * @return 返回用户名
     */
    public static String getUsernameFromToken(String token){
        return decodeToken(token).getUsername();
    }

    /**
     * 通过 token 获取 token起始时间
     * @param token 传入token
     * @return 返回token起始时间
     */
    public static Long getBeginTimeFromToken(String token){
        return decodeToken(token).getBegin();
    }

    /**
     * 通过 token 获取 token过期时间
     * @param token 传入token
     * @return 返回token过期时间
     */
    public static Long getEndTimeFromToken(String token){
        return decodeToken(token).getEnd();
    }

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Token算法是一种用于生成和验证令牌的算法,通常用于实现身份验证和授权功能。在C语言中,可以使用各种哈希算法(如MD5、SHA-1、SHA-256等)或者加密算法(如AES、DES等)来实现Token算法Token算法的一般流程如下: 1. 生成Token:首先,需要将用户的信息(如用户名、密码、过期时间等)进行组合,并使用哈希算法或者加密算法生成一个唯一的令牌。这个令牌可以包含必要的信息,并且通常会加入一些随机因子来增加安全性。 2. 存储Token生成的令牌需要被存储到服务器端的数据库或者缓存中,以便后续的验证和使用。在存储时,需要注意保护令牌的安全性,防止被恶意获取。 3. 验证Token:当用户进行操作时,需要提供相应的令牌进行验证。服务器端会使用相同的算法对用户提供的令牌进行验证,并检查令牌中的信息是否与数据库中存储的一致。如果验证通过,则允许用户进行相应的操作;否则,拒绝用户的请求。 为了在C语言中实现Token算法,需要先选择合适的哈希算法或者加密算法,并使用相关的库函数进行实现。例如,对于哈希算法可以使用C语言的openssl库或者mbedtls库进行实现,而对于加密算法可以使用openssl库或者libsodium库进行实现。在具体实现时,需要考虑到安全性、效率和易用性等因素,确保生成Token既安全又实用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值