Java加密AES算法及spring中应用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java加密AES算法及spring中应用相关的知识,希望对你有一定的参考价值。

开门见山直接贴上代码

1.AESUtil加密解密工具类
    import java.security.Key;
    import java.security.SecureRandom;
    import java.util.Base64;

    import javax.crypto.Cipher;
    import javax.crypto.KeyGenerator;

    /**
     * @description: AES加密工具类
     * @author: maojialong
     * @date: 2017年11月7日 上午10:11:02
     */
    public class AESUtils {
        
        //实例化密钥
        private static Key key;
        
        //原始密钥
        private static String KEY_STR = "my-springmvc-2017-11-07";
        
        //编码
        private static String CHARSETNAME = "UTF-8";
        
        //密钥算法
        private static String KEY_ALGORITHM = "AES";
        
        //加密-解密算法 / 工作模式 / 填充方式
        private static String CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding";
        
        /**
         * 初始化key
         */
        static {
            try {
                KeyGenerator kgen = KeyGenerator.getInstance(KEY_ALGORITHM);
                SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
                random.setSeed(KEY_STR.getBytes());
                kgen.init(128, random);
                key = kgen.generateKey();
                kgen = null;
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
        
        /**
         * @description: AES对称加密字符串,并通过Jdk自带Base64转换为ASCII
         * @author: Administrator
         * @date: 2017年11月7日 上午9:37:48
         * @param str
         * @return
         */
        public static String getEncryptString(String str) {
            try {
                byte[] bytes = str.getBytes(CHARSETNAME);
                Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
                cipher.init(Cipher.ENCRYPT_MODE, key);
                byte[] doFinal = cipher.doFinal(bytes);
                return Base64.getEncoder().encodeToString(doFinal);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
     
        /**
         * @description: 对AES加密字符串进行解密
         * @author: maojialong
         * @date: 2017年11月7日 上午10:14:00
         * @param str
         * @return
         */
        public static String getDecryptString(String str) {
            try {
                byte[] bytes = Base64.getDecoder().decode(str);
                Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
                cipher.init(Cipher.DECRYPT_MODE, key);
                byte[] doFinal = cipher.doFinal(bytes);
                return new String(doFinal, CHARSETNAME);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    }

2.自定义配置文件解析类
    import java.util.List;

    import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;

    /** 
     * @description: 自定义AES解密
     * @author: maojialong
     * @date: 2017年11月7日 上午10:26:50
     */
    public class EncodeAESPlaceholderConfigurer extends PropertyPlaceholderConfigurer {
    
        private List<String> encodeProperties;
        
        /** 
         * @description: 重写convertProperty方法,通过encodeProperties判断是否是经过AES加密
         * @author: maojialong
         * @date: 2017年11月7日 上午10:27:24
         * @param propertyName
         * @param propertyValue
         * @return
         * @see org.springframework.beans.factory.config.PropertyResourceConfigurer#convertProperty(java.lang.String, java.lang.String)
         * TODO
         */
        @Override
        protected String convertProperty(String propertyName, String propertyValue) {
            if(encodeProperties != null && encodeProperties.contains(propertyName)) {
                propertyValue = AESUtils.getDecryptString(propertyValue);
            }
            return super.convertProperty(propertyName, propertyValue);
        }

        public List<String> getEncodeProperties() {
            return encodeProperties;
        }

        public void setEncodeProperties(List<String> encodeProperties) {
            this.encodeProperties = encodeProperties;
        }
    }

3.配置文件中加载配置文件
    <!-- 自定义AES加密解密 -->
    <bean id="propertyConfigurer" class="util.EncodeAESPlaceholderConfigurer">
        <!-- 配置文件地址 -->
        <property name="locations">
            <list>
                <value>classpath:conf/jdbc.properties</value>
                <value>classpath:redis.properties</value>
            </list>
        </property>
        <!-- 配置需要解密的配置项 -->
        <property name="encodeProperties">
            <array>
                <value>jdbc.url</value>
                <value>jdbc.username</value>
                <value>jdbc.password</value>
            </array>
        </property>
    </bean>

 

以上是关于Java加密AES算法及spring中应用的主要内容,如果未能解决你的问题,请参考以下文章

php与java通用AES加密解密算法

我的Android进阶之旅------>Android采用AES+RSA的加密机制对http请求进行加密

对称加密及AES加密算法

干货分享 | 对称加密及AES加密算法

AES加密算法及逆向

对称(DES/AES)与非对称(RSA/SSL/数字证书)加密介绍及实际应用