zoukankan      html  css  js  c++  java
  • DES加密解密实现

     1 package com.liuhq.o2o.utils;
     2 
     3 import java.security.Key;
     4 import java.security.SecureRandom;
     5 
     6 import javax.crypto.Cipher;
     7 import javax.crypto.KeyGenerator;
     8 
     9 import sun.misc.BASE64Decoder;
    10 import sun.misc.BASE64Encoder;
    11 
    12 @SuppressWarnings("restriction")
    13 public class DESUtil {
    14 
    15     private static Key key;
    16     private static String KEY_STR = "myKey";
    17     private static String CHARSETNAME = "UTF-8";
    18     private static String ALGORITHM = "DES";
    19 
    20     static {
    21         try {
    22             // 生成DES算法对象
    23             KeyGenerator generator = KeyGenerator.getInstance(ALGORITHM);
    24             // 运行SHA1安全策略
    25             SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
    26             //设置上秘钥种子
    27             secureRandom.setSeed(KEY_STR.getBytes());
    28             //初始化基于SHA1的算法对象
    29             generator.init(secureRandom);
    30             // 生成秘钥对象
    31             key = generator.generateKey();
    32             generator = null;
    33         } catch (Exception e) {
    34             throw new RuntimeException(e);
    35         }
    36     }
    37     
    38     /**
    39      * 加密
    40      * @param str
    41      * @return
    42      */
    43     public static String getEncryptString(String str) {
    44         // 基于BADE64编码  接受byte[]并转化为String
    45         BASE64Encoder base64encoder = new BASE64Encoder();
    46         try {
    47             // 按UTF8编码
    48             byte[] bytes = str.getBytes(CHARSETNAME);
    49             // 获取加密对象
    50             Cipher cipher = Cipher.getInstance(ALGORITHM);
    51             // 初始化密码信息
    52             cipher.init(Cipher.ENCRYPT_MODE, key);
    53             // 加密
    54             byte[] doFinal = cipher.doFinal(bytes);
    55             // byte[] to encode好的string返回
    56             return base64encoder.encode(doFinal);
    57         } catch (Exception e) {
    58             // TODO: handle exception
    59             throw new RuntimeException(e);
    60         }
    61     }
    62 
    63     /**
    64      * 解密
    65      * @param str
    66      * @return
    67      */
    68     public static String getDecryptString(String str) {
    69         // 基于BADE64编码  接受byte[]并转化为String
    70         
    71         BASE64Decoder base64decoder = new BASE64Decoder();
    72         try {
    73             //将字符串decode成byte[]
    74             byte[] bytes = base64decoder.decodeBuffer(str);
    75             // 获取加密对象
    76             Cipher cipher = Cipher.getInstance(ALGORITHM);
    77             // 初始化密码信息
    78             cipher.init(Cipher.DECRYPT_MODE, key);
    79             //解密
    80             byte[] doFinal = cipher.doFinal(bytes);
    81             //返回解密之后的信息
    82             return new String(doFinal, CHARSETNAME);
    83         } catch (Exception e) {
    84             // TODO: handle exception
    85             throw new RuntimeException(e);
    86         }
    87     }
    88     
    89     public static void main(String[] args) {
    90         System.out.println(getEncryptString("root"));
    91         System.out.println(getEncryptString("123456"));
    92        
    93       
    94     }
    95 
    96 }

     解密jdbc.properties配置文件

    创建EncryptPropertyPlaceholderConfigurer类

    package com.liuhq.o2o.utils;
    
    import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
    
    public class EncryptPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer{
        
         // 需要解密的数组
        private String[] encryptPropNames = { "jdbc.username", "jdbc.password" };
    
        @Override
        protected String convertProperty(String propertyName, String propertyValue) {
            if (isEncryptProp(propertyName)) {
                String decryptValue = DESUtil.getDecryptString(propertyValue);
                return decryptValue;
            } else {
                return propertyValue;
            }
        }
    
        private boolean isEncryptProp(String propertyName) {
            for (String encryptpropertyName : encryptPropNames) {
                if (encryptpropertyName.equals(propertyName))
                    return true;
            }
            return false;
        }
    
    }

    替换<context:property-placeholder location="classpath:jdbc.properties"/>配置

    新的为

    <bean class="com.liuhq.o2o.utils.EncryptPropertyPlaceholderConfigurer">
            <property name="locations">
                <list>
                    <value>classpath:jdbc.properties</value>
                </list>
            </property>
            <property name="fileEncoding" value="UTF-8" />
        </bean>
  • 相关阅读:
    Forethought Future Cup
    2020 CSP-S T3 函数调用(拓扑序+后缀积)
    欧拉图论定理 公式及证明
    2020 CSP-J T3 表达式(栈+二叉树)
    eJOI2018 Problem D Chemical table(二分图+并查集)
    洛谷 P5089 [eJOI2018]元素周期表(二分图+并查集)
    eJOI 2017 Problem A Magic(前缀和+排序)
    洛谷 P6273 [eJOI2017]魔法(前缀和+排序)
    OI常见解题思路技巧大汇总【不定期更新】
    JZOJ 6840. 【2020.11.5提高组模拟】铲雪(线段树)
  • 原文地址:https://www.cnblogs.com/lhq1996/p/11982491.html
Copyright © 2011-2022 走看看