Java通过MySQL的加解密函数实现敏感字段存储

作者:灰太狼_cxh 时间:2024-01-27 12:08:25 

java通过mysql的加解密函数实现敏感字段存储

1.AES加解密工具类:

public class AESUtils {

public static String encrypt(String password, String strKey) {
       try {
           SecretKey key = generateMySQLAESKey(strKey,"ASCII");
           Cipher cipher = Cipher.getInstance("AES");
           cipher.init(Cipher.ENCRYPT_MODE, key);
           byte[] cleartext = password.getBytes("UTF-8");
           byte[] ciphertextBytes = cipher.doFinal(cleartext);
           return new String(Hex.encodeHex(ciphertextBytes));

} catch (UnsupportedEncodingException e) {
           e.printStackTrace();
       } catch (NoSuchAlgorithmException e) {
           e.printStackTrace();
       } catch (NoSuchPaddingException e) {
           e.printStackTrace();
       } catch (InvalidKeyException e) {
           e.printStackTrace();
       } catch (IllegalBlockSizeException e) {
           e.printStackTrace();
       } catch (BadPaddingException e) {
           e.printStackTrace();
       }
       return null;
   }

public static String decrypt(String content, String aesKey){
       try {
           SecretKey key = generateMySQLAESKey(aesKey,"ASCII");
           Cipher cipher = Cipher.getInstance("AES");
           cipher.init(Cipher.DECRYPT_MODE, key);
           byte[] cleartext = Hex.decodeHex(content.toCharArray());
           byte[] ciphertextBytes = cipher.doFinal(cleartext);
           return new String(ciphertextBytes, "UTF-8");

} catch (UnsupportedEncodingException e) {
           e.printStackTrace();
       } catch (NoSuchAlgorithmException e) {
           e.printStackTrace();
       } catch (NoSuchPaddingException e) {
           e.printStackTrace();
       } catch (InvalidKeyException e) {
           e.printStackTrace();
       } catch (IllegalBlockSizeException e) {
           e.printStackTrace();
       } catch (BadPaddingException e) {
           e.printStackTrace();
       } catch (DecoderException e) {
           e.printStackTrace();
       }
       return null;
   }

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);
       }
   }

public static String getAesKey(){
       StringBuilder sb = new StringBuilder();
       Random random = new Random();
       for(int i = 0; i < 16; i++){
           sb.append(random.nextInt(10));
       }
       return sb.toString();
   }

public static void main(String[] args){
      String abc = "1";
      String aeskey = "3532263592381276";
      String a1= encrypt(abc, aeskey);
      System.out.println("加密后:" + a1);
      System.out.println("解密后:" +decrypt(a1, aeskey));
  }

}

运行main方法结果:

加密后:62b778a8ccaa40cce4c9e4e42c693665
解密后:1

2.mysql的sql加解密:

生成16随机盐:3532263592381276

select  concat((SELECT CEILING(RAND()*9000000000000000+1000000000000000)),'');

加密:62B778A8CCAA40CCE4C9E4E42C693665

SELECT (HEX(AES_ENCRYPT(1,"3532263592381276")))

解密:1

SELECT AES_DECRYPT(UNHEX("62B778A8CCAA40CCE4C9E4E42C693665"),"3532263592381276")

3.实现效果:

java工具类加解密和mysql的加解密效果是一样的。

知识点补充

mysql下的加密函数有如下几个

PASSWORD():创建一个经过加密的密码字符串,适合于插入到MySQL的安全系

统。该加密过程不可逆,和unix密码加密过程使用不同的算法。主要用于MySQL的认证系统。

ENCRYPT(,):使用UNIX crypt()系统加密字符串,ENCRYPT()函数接收要加密的字符串和(可选的)用于加密过程的salt(一个可以唯一确定口令的字符串,就像钥匙一样),注意,windows上不支持

ENCODE(,)   DECODE(,):加密解密字符串。该函数有两个参数:被加密或解密的字符串和作为加密或解密基础的密钥。Encode结果是一个二进制字符串,以BLOB类型存储。加密成都相对比较弱

MD5():计算字符串的MD5校验和(128位)

SHA5():计算字符串的SHA5校验和(160位)

以上两个函数返回的校验和是16进制的,适合与认证系统中使用的口令。

来源:https://blog.csdn.net/weixin_39220472/article/details/123178397

标签:Java,MySQL,敏感字段,存储
0
投稿

猜你喜欢

  • Python编程中如何捕获警告ps不是捕获异常

    2021-05-28 15:23:09
  • 在Docker上开始部署Python应用的教程

    2023-11-13 12:38:37
  • 基于pytorch的lstm参数使用详解

    2023-11-21 08:41:21
  • python图形用户接口实例详解

    2023-10-17 21:05:20
  • Python面向对象之类和对象实例详解

    2022-10-02 05:39:34
  • 使用MySQL数据库的23个注意事项

    2010-03-18 15:46:00
  • python regex库实例用法总结

    2023-11-02 12:17:27
  • 技巧和诀窍:用Silverlight支持全屏模式

    2007-09-23 12:37:00
  • 一个拖动层和Onmouse自动下拉效果

    2007-10-08 21:25:00
  • django框架如何集成celery进行开发

    2022-09-13 11:18:24
  • python查询MySQL将数据写入Excel

    2023-12-15 13:48:11
  • Python3中的多行输入问题

    2023-02-06 13:11:23
  • Python yield的用法实例分析

    2022-08-03 10:00:21
  • python字符串运算符详情

    2023-11-19 20:51:31
  • asp xmlhttp下载一句话

    2013-06-30 06:47:48
  • Mysql数据库按时间点恢复实战记录

    2024-01-16 22:37:56
  • 如何利用Golang解析读取Mysql备份文件

    2024-01-28 20:51:19
  • 解析JavaScript中 querySelector 与 getElementById 方法的区别

    2024-04-19 09:57:32
  • python爬取一组小姐姐图片实例

    2023-08-03 15:05:45
  • 开发心得--写给想学Javascript朋友的一点经验之谈

    2009-02-25 11:42:00
  • asp之家 网络编程 m.aspxhome.com