• aes+base64带有效期的消息加密、解密


    package util;
    
    import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
    import org.apache.commons.lang3.StringUtils;
    
    import javax.crypto.Cipher;
    import javax.crypto.KeyGenerator;
    import javax.crypto.SecretKey;
    import javax.crypto.spec.SecretKeySpec;
    import java.security.SecureRandom;
    
    /**
     * @author: sk
     * @date: 2020/8/10
     * @des: 对userName通过AES加密,附带有效期。
     */
    public class AESUtil {
        //秘钥随机密码
        private static String pwd = "aaa";
        //密文有效期10分钟
        private static Integer validity = 10;
    
        /**
         *@描述 :加密
         *@参数
         *@返回值
         *@创建人  sk
         *@创建时间  2020/8/10
         *@修改人和其它信息
         */
        public static String encrypt(String content) {
            byte[] result = null;
            try {
                if (StringUtils.isEmpty(content)){
                    return null;
                }
                //获取一个秘钥生成器
                KeyGenerator kgen = KeyGenerator.getInstance("AES");
                SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
                random.setSeed(pwd.getBytes());
                //初始化128位key
                kgen.init(128, random);
                //生产一个秘钥
                SecretKey secretKey = kgen.generateKey();
                //返回基本编码格式秘钥,如果秘钥不支持编码则返回为空!
                byte[] enCodeFormat = secretKey.getEncoded();
                //转换为AES专用秘钥
                SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
                //创建密码器
                Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
                //初始化为加密模式密码器
                cipher.init(Cipher.ENCRYPT_MODE, key);
                /**时间戳放入明文在解密时验证密文是否在有效期内**/
                content = System.currentTimeMillis()+"@" + content;
                byte[] byteContent = content.getBytes();
                //加密
                result = cipher.doFinal(byteContent);
            } catch (Exception e) {
                return null;
            }
            //返回base64编码密文
            return new String(Base64.encode(result));
        }
    
        /**
         *@描述 :解密
         *@参数
         *@返回值
         *@创建人  sk
         *@创建时间  2020/8/10
         *@修改人和其它信息
         */
        public static String decrypt(String content) {
            byte[] result = null;
            byte[] bytes = Base64.decode(content);
            try {
                //获取一个秘钥生成器
                KeyGenerator kgen = KeyGenerator.getInstance("AES");
                SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
                random.setSeed(pwd.getBytes());
                //初始化为128位key
                kgen.init(128, random);
                //生成一个秘钥
                SecretKey secretKey = kgen.generateKey();
                //生成一个基本编码格式秘钥
                byte[] enCodeFormat = secretKey.getEncoded();
                //转换为AES专用秘钥
                SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
                //创建密码器
                Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
                //初始化为加密模式密码器
                cipher.init(Cipher.DECRYPT_MODE, key);
                //解密
                result = cipher.doFinal(bytes);
            } catch (Exception e) {
                return null;
            }
            String plaintext = new String(result);
            String[] split = plaintext.split("@");
            //计算有效期
            boolean b = (System.currentTimeMillis() - Long.parseLong(split[0])) / (1000 * 60) <= validity;
            //有效期内,返回明文
            if (b){
                return split[1];
            }
            //密文失效,返回null
            else {
                return null;
            }
        }
    
    
    
        public static void main(String[] args) throws InterruptedException {
    //        String content = "123654哈哈";
    //        System.out.println("加密前=" + content);
    //        String encrypt = AESUtil.encrypt(content);
    //        System.out.println("加密后=" + encrypt);
    //        Thread.sleep(200000);
            String decrypt = AESUtil.decrypt("e/4cLTX722PgxXkHG30s5OedHOi44UGOqkC6ei3eWuc=");
            System.out.println("解密后=" + decrypt);
    
        }
    
    
    }
  • 相关阅读:
    菜鸟nginx源码剖析数据结构篇(十一) 共享内存ngx_shm_t[转]
    菜鸟nginx源码剖析数据结构篇(十) 自旋锁ngx_spinlock[转]
    菜鸟nginx源码剖析数据结构篇(九) 内存池ngx_pool_t[转]
    菜鸟nginx源码剖析数据结构篇(八) 缓冲区链表ngx_chain_t[转]
    菜鸟nginx源码剖析数据结构篇(七) 哈希表 ngx_hash_t(下)[转]
    菜鸟nginx源码剖析数据结构篇(六) 哈希表 ngx_hash_t(上)[转]
    菜鸟nginx源码剖析数据结构篇(五) 基数树 ngx_radix_tree_t[转]
    菜鸟nginx源码剖析数据结构篇(四)红黑树ngx_rbtree_t[转]
    菜鸟nginx源码剖析数据结构篇(三) 单向链表 ngx_list_t[转]
    菜鸟nginx源码剖析数据结构篇(二) 双向链表ngx_queue_t[转]
  • 原文地址:https://www.cnblogs.com/shengkai126126/p/13474253.html
Copyright © 2020-2023  润新知