Java通过MySQL的加解密函数实现敏感字段存储
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进制的,适合与认证系统中使用的口令。
到此这篇关于Java通过MySQL的加解密函数实现敏感字段存储的文章就介绍到这了,更多相关Java敏感字段存储内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
java Iterator接口和LIstIterator接口分析
这篇文章主要介绍了java Iterator接口和LIstIterator接口分析的相关资料,需要的朋友可以参考下2017-05-05IDEA 2020.1 for Mac 下载安装配置及出现的问题小结
这篇文章主要介绍了IDEA 2020.1 for Mac 下载安装配置及出现的问题小结,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2021-03-03SpringBoot 整合 Elasticsearch 实现海量级数据搜索功能
这篇文章主要介绍了SpringBoot 整合 Elasticsearch 实现海量级数据搜索,本文主要围绕 SpringBoot 整合 ElasticSearch 接受数据的插入和搜索使用技巧,在实际的使用过程中,版本号尤其的重要,不同版本的 es,对应的 api 是不一样,需要的朋友可以参考下2022-07-07
最新评论