最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java 敏感信息加密處理

 更新時(shí)間:2017年03月17日 10:12:26   作者:SZBright  
本文主要介紹了Java 敏感信息加密處理的相關(guān)知識(shí):1)敏感信息加密處理我們要實(shí)現(xiàn)什么;2)敏感信息加密處理我做了些什么;3)敏感信息加密實(shí)現(xiàn)方法。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧

一、敏感信息加密處理我們要實(shí)現(xiàn)什么

系統(tǒng)往往需要將用戶敏感信息進(jìn)行加密,不同的敏感信息加密要求不同。

比如,密碼的加密,我們往往不需要是可逆的。用戶輸入密碼后,通過(guò)系統(tǒng)的加密規(guī)則,編碼后直接比對(duì)加密存儲(chǔ)的密碼,獲得比對(duì)結(jié)果即可證明用戶登錄信息合法性。

然后,有時(shí)我們?yōu)榱朔乐贡幻搸?kù)導(dǎo)致的數(shù)據(jù)泄漏,不得不對(duì)一些敏感信息(比如:身份證號(hào)、手機(jī)號(hào))進(jìn)行加密。這樣的數(shù)據(jù)不僅要求加密,還需要在展示及其他業(yè)務(wù)場(chǎng)景下完全顯示,或者掩碼顯示,這就需要我們對(duì)加密的內(nèi)容進(jìn)行解密。

二、敏感信息加密處理我做了些什么

近來(lái),項(xiàng)目中為了實(shí)現(xiàn)這個(gè)需求,做了些簡(jiǎn)單的設(shè)計(jì):

注:考慮到在維護(hù)生產(chǎn)數(shù)據(jù)時(shí)方便查詢,這里使用aes加密方式,該加密方式同mysql的aes加密結(jié)果相同,故可在sql中直接使用hex及aes_encrypt函數(shù)進(jìn)行查詢;密鹽可保存在配置文件中。

1.使用自定義注解,po的每個(gè)類中需要加密及解密的字段可添加該注解

2.聲明Base類,并實(shí)現(xiàn)encrypt和decrypt方法,方法實(shí)現(xiàn)利用java反射及自定義注解

3.所有需要用到加密及解密的實(shí)體對(duì)象,必須繼承自Base類

4.實(shí)體類加密時(shí)調(diào)用encrypt方法,解密時(shí)調(diào)用decrypt方法,如此可實(shí)現(xiàn)對(duì)該對(duì)象中敏感數(shù)據(jù)的加密解密

三、敏感信息加密實(shí)現(xiàn)

1.先看效果

注釋很清楚,先給對(duì)象設(shè)置身份證號(hào),然后執(zhí)行自加密方法,返回自己的引用,打印出來(lái)加密后該對(duì)象的json字符串;執(zhí)行自解密方法,返回自己的引用,打印出來(lái)解密后該對(duì)象的json字符串。

2.設(shè)計(jì)實(shí)現(xiàn)結(jié)構(gòu)

crypt
   |
   |--annotation
   |    |--DecryptFiled
   |    |--EncryptFiled
   |--crypt
   |    |--EncryptDecryptInterface
   |--domain
   |    |--BaseInfo
   |    |--SimpleDomain
   |--utils
   |    |--MySqlUtils

2.1先看看注解的實(shí)現(xiàn)

/**
 * Created by bright on 2017/2/22.
 *
 * @author :
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface EncryptFiled {
  String value() default "";
}

自定義注解

兩個(gè)注解的實(shí)現(xiàn)一致,注解名稱不同而已,不再貼另外一個(gè)注解的代碼。

2.2定義自加密、自解密接口

Base類實(shí)現(xiàn)該接口中的自加密自解密方法

/**
 * Created by bright on 2017/2/22.
 *
 * @author :
 */
public interface EncryptDecryptInterface {
  public <T> T encryptSelf();
  public <T> T decryptSelf();
}

自定義接口

2.3MysqlUtils的實(shí)現(xiàn)

/**
 * Created by bright on 2017/2/22.
 *
 * @author :
 */
@Component
public class MySqlUtils {
  private static final String ENCRYPTTYPE= "AES";//加密方式
  private static final String ENCODING = "UTF-8";//加密時(shí)編碼

  private static String MYSQLUTILSKEY = "aaa";//加密密鹽
  private static MySqlUtils mysqlUtils;//單例
  private static Cipher encryptCipher ;//加密cipher
  private static Cipher decryptChipher;//解密chipher
  /**
   * 該方法可用在spring項(xiàng)目中使用配置文件設(shè)置密鹽,默認(rèn)值為123
   * @param key
   */
  @Value("${mysql.column.crypt.key:123}")
  public void setMysqlutilskey(String key){
    MySqlUtils.MYSQLUTILSKEY = key;
  }
  /**
   * encryptCipher、decryptChipher初始化
   */
  public static void init(){
    try {
      encryptCipher = Cipher.getInstance(ENCRYPTTYPE);
      decryptChipher = Cipher.getInstance(ENCRYPTTYPE);
      encryptCipher.init(Cipher.ENCRYPT_MODE, generateMySQLAESKey(MYSQLUTILSKEY, ENCODING));
      decryptChipher.init(Cipher.DECRYPT_MODE, generateMySQLAESKey(MYSQLUTILSKEY, ENCODING));
    } catch (InvalidKeyException e) {
      throw new RuntimeException(e);
    } catch (NoSuchAlgorithmException e) {
      throw new RuntimeException(e);
    } catch (NoSuchPaddingException e) {
      throw new RuntimeException(e);
    }
  }
  /**
   * 單例獲取方法實(shí)現(xiàn)
   * @return
   */
  public synchronized static MySqlUtils getInstance(){
    if(mysqlUtils == null){
      mysqlUtils = new MySqlUtils();
      init();
    }
    return mysqlUtils;
  }
  /**
   * 加密算法
   * @param encryptString
   * @return
   */
  public String mysqlAESEncrypt(String encryptString) {
    try{
      return new String(Hex.encodeHex(encryptCipher.doFinal(encryptString.getBytes(ENCODING)))).toUpperCase();
    } catch (BadPaddingException e) {
      throw new RuntimeException(e);
    } catch (UnsupportedEncodingException e) {
      throw new RuntimeException(e);
    } catch (IllegalBlockSizeException e) {
      throw new RuntimeException(e);
    }
  }
  /**
   * 解密算法
   * @param decryptString
   * @return
   */
  public String mysqlAESDecrypt(String decryptString){
    try {
      return new String(decryptChipher.doFinal(Hex.decodeHex(decryptString.toCharArray())));
    } catch (DecoderException nspe) {
      throw new RuntimeException(nspe);
    } catch (BadPaddingException nsae) {
      throw new RuntimeException(nsae);
    } catch (IllegalBlockSizeException ike) {
      throw new RuntimeException(ike);
    }
  }
  /**
   * 產(chǎn)生mysql-aes_encrypt
   * @param key 加密的密鹽
   * @param encoding 編碼
   * @return
   */
  public static SecretKeySpec generateMySQLAESKey(final String key, final String encoding) {
    try {
      final byte[] finalKey = new byte[16];
      int i = 0;
      for(byte b : key.getBytes(encoding))
        finalKey[i++%16] ^= b;
      return new SecretKeySpec(finalKey, "AES");
    } catch(UnsupportedEncodingException e) {
      throw new RuntimeException(e);
    }
  }
}

MysqlUtils

2.4BaseInfo類的實(shí)現(xiàn)

/**
 * Created by bright on 2017/2/22.
 *
 * @author :
 */
public class BaseInfo implements Cloneable, EncryptDecryptInterface {
  /**
   * 拷貝一個(gè)對(duì)象,并對(duì)新對(duì)象進(jìn)行加密
   * 該方法主要用在日志打印上,可防止原對(duì)象被加密而影響程序執(zhí)行
   * @param <T>
   * @return
   */
  public <T extends BaseInfo> T cloneAndEncrypt() {
    T cloneT = null;
    try {
      cloneT = (T) this.clone();
    } catch (CloneNotSupportedException e) {
      e.printStackTrace();
      return null;
    }
    if(cloneT !=null)
      return cloneT.encryptSelf();
    throw new RuntimeException("拷貝對(duì)象異常");
  }
  /**
   * 重寫clone方法
   * @return
   * @throws CloneNotSupportedException
   */
  @Override
  protected Object clone() throws CloneNotSupportedException {
    try {
      return super.clone();
    } catch (CloneNotSupportedException e) {
      e.printStackTrace();
      return null;
    }
  }
  /**
   * 實(shí)現(xiàn)自加密
   *
   * @param <T>
   * @return
   */
  public <T> T encryptSelf() {
    Field[] declaredFields = this.getClass().getDeclaredFields();
    try {
      if (declaredFields != null && declaredFields.length > 0) {
        for (Field field : declaredFields) {
          if (field.isAnnotationPresent(EncryptFiled.class) && field.getType().toString().endsWith("String")) {
            field.setAccessible(true);
            String fieldValue = (String) field.get(this);
            if (StringUtils.isNotEmpty(fieldValue)) {
              field.set(this, MySqlUtils.getInstance().mysqlAESEncrypt(fieldValue));
            }
            field.setAccessible(false);
          }
        }
      }
    } catch (IllegalAccessException e) {
      throw new RuntimeException(e);
    }
    return (T) this;
  }
  /**
   * 實(shí)現(xiàn)自解密
   *
   * @param <T>
   * @return
   */
  public <T> T decryptSelf() {
    Field[] declaredFields = this.getClass().getDeclaredFields();
    try {
      if (declaredFields != null && declaredFields.length > 0) {
        for (Field field : declaredFields) {
          if (field.isAnnotationPresent(DecryptFiled.class) && field.getType().toString().endsWith("String")) {
            field.setAccessible(true);
            String fieldValue = (String)field.get(this);
            if(StringUtils.isNotEmpty(fieldValue)) {
              field.set(this, MySqlUtils.getInstance().mysqlAESDecrypt(fieldValue));
            }
          }
        }
      }
    } catch (IllegalAccessException e) {
      throw new RuntimeException(e);
    }
    return (T) this;
  }
}

BaseInfo

2.5一個(gè)簡(jiǎn)單的對(duì)象

/**
 * Created by bright on 2017/2/22.
 *
 * @author :
 */
public class SimpleDomain extends BaseInfo{
  @EncryptFiled
  @DecryptFiled
  private String id;
  public String getId() {
    return id;
  }
  public void setId(String id) {
    this.id = id;
  }
}

SimpleDomain

2.6來(lái)個(gè)調(diào)用

public class Client {
  @Test
  public void test(){
    SimpleDomain sd = new SimpleDomain();//要進(jìn)行加密解密的實(shí)體類
    sd.setId("6029131988005021537");//注入身份證號(hào)
    System.out.println(JSON.toJSONString(sd.encryptSelf()));//執(zhí)行自加密后輸出
    System.out.println(JSON.toJSONString(sd.decryptSelf()));//執(zhí)行自解密后輸出
  }
}

Client

以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持腳本之家!

相關(guān)文章

  • Java那點(diǎn)事——StringBuffer與StringBuilder原理與區(qū)別

    Java那點(diǎn)事——StringBuffer與StringBuilder原理與區(qū)別

    本文給大家分享StringBuffer與StringBuilder的區(qū)別,它們的應(yīng)用場(chǎng)景是什么?非常不錯(cuò),面試考官經(jīng)??嫉囊粋€(gè)問(wèn)題,有需要的朋友跟著腳本之家小編一起學(xué)習(xí)吧
    2016-06-06
  • Java獲取時(shí)間差(天數(shù)差,小時(shí)差,分鐘差)代碼示例

    Java獲取時(shí)間差(天數(shù)差,小時(shí)差,分鐘差)代碼示例

    這篇文章主要介紹了Java獲取時(shí)間差(天數(shù)差,小時(shí)差,分鐘差)代碼示例,使用SimpleDateFormat來(lái)實(shí)現(xiàn)的相關(guān)代碼,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • 詳解Java接口簽名(Signature)實(shí)現(xiàn)方案

    詳解Java接口簽名(Signature)實(shí)現(xiàn)方案

    這篇文章主要介紹了Java接口簽名(Signature)實(shí)現(xiàn)方案?,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-01-01
  • java 排序算法之冒泡排序

    java 排序算法之冒泡排序

    這篇文章主要介紹了java 排序算法之冒泡排序,文中運(yùn)用大量的代碼講解相關(guān)知識(shí),非常詳細(xì),感興趣的小伙伴可以參考一下
    2021-09-09
  • 淺談JSONObject的使用及示例代碼(JSON解析)

    淺談JSONObject的使用及示例代碼(JSON解析)

    這篇文章主要介紹了淺談JSONObject的使用及示例代碼(JSON解析),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • Spring Boot日志技術(shù)logback原理及配置解析

    Spring Boot日志技術(shù)logback原理及配置解析

    這篇文章主要介紹了Spring Boot日志技術(shù)logback原理及用法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • 基于Java+SpringBoot實(shí)現(xiàn)人臉識(shí)別搜索

    基于Java+SpringBoot實(shí)現(xiàn)人臉識(shí)別搜索

    人臉識(shí)別搜索技術(shù)作為現(xiàn)代計(jì)算機(jī)視覺領(lǐng)域的重要研究方向之一,已經(jīng)在多個(gè)領(lǐng)域展現(xiàn)出巨大的應(yīng)用潛力,隨著信息技術(shù)的飛速發(fā)展,人臉識(shí)別搜索在多個(gè)領(lǐng)域得到了廣泛關(guān)注和應(yīng)用,本文旨在探討人臉識(shí)別搜索技術(shù)的背景、原理以及其在實(shí)際應(yīng)用中的意義和挑戰(zhàn)
    2023-08-08
  • springboot整合過(guò)濾器實(shí)戰(zhàn)步驟

    springboot整合過(guò)濾器實(shí)戰(zhàn)步驟

    在項(xiàng)目開發(fā)過(guò)程中,過(guò)濾器或者攔截器幾乎是必用的,他可以很方便的完成類似日志處理、token驗(yàn)證等一系列操作,區(qū)別于業(yè)務(wù)接口,獨(dú)立進(jìn)行處理,感覺就是一種Aop思想。下面模擬請(qǐng)求接口前的token驗(yàn)證,進(jìn)行過(guò)濾器的實(shí)戰(zhàn)
    2022-04-04
  • javaWeb使用servlet搭建服務(wù)器入門

    javaWeb使用servlet搭建服務(wù)器入門

    這篇文章主要為大家詳細(xì)介紹了javaWeb使用servlet搭建服務(wù)器入門,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • JavaSE反射、枚舉、lambda表達(dá)式常用方法舉例

    JavaSE反射、枚舉、lambda表達(dá)式常用方法舉例

    這篇文章主要介紹了JavaSE反射、枚舉、lambda表達(dá)式常用方法的相關(guān)資料,反射允許在運(yùn)行時(shí)檢查和操作類、方法和屬性,枚舉提供了一種更安全和優(yōu)雅的方式來(lái)定義常量,而Lambda表達(dá)式則簡(jiǎn)化了函數(shù)式接口的實(shí)現(xiàn),需要的朋友可以參考下
    2024-12-12

最新評(píng)論

常熟市| 梅河口市| 海晏县| 沁阳市| 克山县| 平山县| 双流县| 砀山县| 温泉县| 修文县| 开化县| 麻江县| 内黄县| 无为县| 汕头市| 井陉县| 福安市| 崇左市| 收藏| 古田县| 砚山县| 丹东市| 大悟县| 于田县| 乐山市| 疏附县| 诏安县| 临沂市| 平阴县| 临澧县| 江华| 福清市| 凤台县| 扶沟县| 平邑县| 孟州市| 陆河县| 丰台区| 两当县| 新民市| 连山|