JAVA使用mysql加密解密函数(AES_ENCRYPT/AES_DECRYPT)

文章介绍了在JavaWeb开发中,不应明文存储用户密码,而应利用MySQL的AES_ENCRYPT和AES_DECRYPT函数进行加密解密。通过示例展示了如何在Java中使用这两个函数,强调了加密解密的关键在于一致的密钥,以及不正确使用可能导致的数据无法解密问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

  最近大学做JavaWeb课设时发现,很多同学的有关于账号密码都是明文储存在mysql数据库中,其实这样做在实际应用中是非常不安全的,其实mysql最近本身就提供了非常好的两个函数来供我们去加密解密我们要存入的数据,下面我们就来介绍一下如何在java中使用加密解密函数去存储一下铭感的数据。


提示:以下是本篇文章正文内容,下面案例可供参考

正文

我们就举一个最常见的使用JavaWeb来实现注册登录功能的例子,很多同学在存账号密码到mysql中时就像如下代码所示直接将用户注册时输入的密码直接明文存入到了mysql数据库中。

 public void DepositUser(String name,String password)
 {
     Connection con=getConn();
        try
        {
            //存入账号密码
            Statement st=con.createStatement();
            st.executeUpdate("INSERT INTO `user` (`user_name`, `user_password`) 
            VALUES ('"+name+"','"+password+"');");

        }
        catch (Exception e){e.printStackTrace();}
 }

其实这样时非常不安全的,我们可以使用MYSQL提供的AES_ENCRYPT和AES_AES_DECRYPT这两个函数对数据进行加密存入 。

下面我对这两个函数的用法进行简单的介绍,并通过上面的例子来演示一下

AES_ENCRYPT函数就是加密函数,encrypt的英文意思就是加密,很好记忆

其加密原理可以看下面博主得到描述的十分详细

AES加密算法原理_张维鹏的博客-CSDN博客_aes加密算法原理

其使用步骤如下:

1、先将我们要将存入加密的数据在数据库中的类型改为vinbinary,实体类的类型还是可以用String类型就行了。

2、我们在java中向数据库中插入数据时使用加密函数加密。

 其用法非常简单,加密函数AES_ENCRYPT用有两个参数,前面的一个参数代表我们要加密的数据,后面一个参数我们可以理解为一个key,我们加密和解密的数据只能通过这个key去匹配是否是同一个数据,若加密设置key为‘Akey’,我们去解密这个数据时将key写为‘Bkey’,那么就不能解密这个数据了。

加密后的数据我们在mysql数据库中查看如下所示:

 这样就加密完成了

3、若需要我们解密已经存入的数据,我们就可以使用AES_DECRYPT函数来进行解密

我们通过下面的代码演示其解密效果:

 @Test
 public void test() throws ClassNotFoundException, SQLException
 {
        //连接mysql数据库
        Class.forName("com.mysql.cj.jdbc.Driver");
        Connection connection = 
        DriverManager.getConnection("jdbc:mysql://localhost:3306/chx? 
        serverTimezone=UTC","root","a2002621731");
        Statement st=connection.createStatement();
        //解密数据
        ResultSet rs=st.executeQuery("select AES_DECRYPT(password,'key')
        from chx.tb_user where id='222'");
        //测试解密效果
        while (rs.next())
        {
            System.out.println(rs.getString(1));
        }

    }

解密函数AES_DECRYPT的参数也有两个,其意义和解密函数AES_ENCRYPT类似。 

运行上面测试代码,

我们可以发现已经解密成功了。

同时在打印台我们发现有一串null,这是因为我们这个解密函数是根据这个key来解密的,如果我们加密的时候设置的key和解密的时候的key不一样,那么函数就不会去根据AES规则去解密数据,所以那个null就是因为我之前存储的数据没有设置key或设置的key不同,所以查询的数据变为null了 

 


总结

以上就是今天介绍的内容,简单描述了mysql提供的加密解密函数在java中的应用,希望对你有帮助。

 

<think>好的,我现在需要处理用户关于AES_ENCRYPT函数的具体实现和用法的问题。用户之前已经询问过SUBWORD和ROTWORD的含义,现在他们转向了实际应用中的函数使用,特别是MySQL中的AES_ENCRYPT。根据提供的引用内容,用户可能想了解如何在数据库使用这个函数进行加密,以及背后的实现细节。 首先,我需要确认用户的需求。他们提到“AES_encrypt的具体实现或用法”,但可能混淆了不同系统中的函数名称。例如,在MySQL中是AES_ENCRYPT,而其他编程语言可能有不同的实现。根据用户提供的引用,大部分是关于MySQL的,所以应该重点讲解MySQL中的使用。 接下来,我需要整理引用中的信息。引用1、2、3、5都提到了MySQLAES_ENCRYPTAES_DECRYPT函数,强调它们的基本用法和参数。引用4提到了GBase8c的类似函数,可能说明用户对数据库加密有更广泛的兴趣,但当前问题应集中在MySQL上。 用户之前的问题涉及AES的密钥扩展和底层操作,现在转向应用层面,可能需要连接理论到实际应用。例如,解释AESMySQL中的实现是否涉及SUBWORD和ROTWORD等步骤,或者如何配置加密参数如密钥长度和模式。 另外,用户提供的引用提到密钥长度、加密模式(如CBC)、初始化向量(IV)的使用,这些都需要在回答中涵盖。特别是引用4详细说明了IV的重要性,这可能需要在用法部分强调,尽管在MySQL的默认实现中可能不显式使用IV,但用户需要知道如何正确设置。 需要注意的是,用户可能对加密的安全性有疑问,比如如何选择合适的密钥,避免使用弱密钥,以及存储加密数据的最佳实践。引用5提到SQL级别的加密,这可能涉及应用设计方面的考虑,如加密字段的选择和性能影响。 在结构上,我应该先介绍函数的基本用法,包括语法和参数,然后提供示例代码,如SQL语句。接着深入实现细节,比如MySQL使用AES模式和填充方式,密钥处理机制,可能涉及到的底层AES步骤(如SUBWORD和ROTWORD在密钥扩展中的作用)。然后讨论安全注意事项,如密钥管理和IV的使用。最后,与其他加密方法的对比和常见问题解答,帮助用户全面理解。 需要验证MySQLAES_ENCRYPT是否默认使用128位密钥,是否支持更长密钥,以及加密模式是否是ECB或CBC,因为不同的模式会影响安全性和IV的必要性。根据引用2,MySQL可能默认使用128位,但允许扩展到256位,但需要确认具体配置方式,如通过block_encryption_mode参数设置。 另外,用户可能遇到的常见问题包括加密后的数据存储(BLOB类型),编码问题(如字符集),以及如何在查询中使用加密字段进行检索(可能需要全文解密,影响性能)。 最后,结合用户之前的兴趣点(SUBWORD和ROTWORD),可以简要说明这些底层操作在MySQLAES实现中是如何被调用的,但可能不需要深入代码层面,因为用户现在更关注应用。 总结回答结构:定义函数、参数详解、示例、实现细节(模式、填充、密钥处理)、安全建议、常见问题、相关函数比较,以及相关问题。</think>### AES_ENCRYPT函数实现及用法详解 --- #### 一、函数定义与基本用法 **1. 函数语法** ```sql AES_ENCRYPT(plaintext, key_str [, init_vector]) AES_DECRYPT(ciphertext, key_str [, init_vector]) ``` - **plaintext**:需加密的明文(字符串或二进制数据) - **key_str**:加密密钥(长度建议与加密模式匹配,如128/192/256位) - **init_vector**:初始化向量(仅部分加密模式需要,如CBC)[^4] **2. 默认行为** - MySQL默认使用**AES-128-ECB**模式(无IV) - 可通过配置`block_encryption_mode`切换模式(如`aes-256-cbc`)[^4] - 加密结果以二进制字符串(BLOB类型)存储 --- #### 二、参数详解与安全实践 **1. 密钥(key_str)** - **长度要求**: - ECB模式:密钥长度直接对应加密强度(128/192/256位) - CBC/CFB/OFB模式:由`block_encryption_mode`定义(如`aes-256-cfb`需256位密钥) - **安全建议**: - 使用随机生成的二进制密钥(如`SHA2(RAND(), 256)`) - 避免使用可预测的字符串(如生日、简单单词)[^5] **2. 初始化向量(init_vector)** - **适用模式**:CBC、CFB、OFB等需要IV的模式 - **生成规则**: - 长度≥16字节(超出部分自动截断) - CBC/CFB模式需保证**不可预测性**(如随机生成) - OFB模式需保证**唯一性**(避免重复使用)[^4] --- #### 三、具体实现与底层逻辑 **1. 加密流程(以AES-128-CBC为例)** 1. **密钥扩展**: - 通过`SUBWORD`和`ROTWORD`生成轮密钥(参考用户前序问题) - 密钥长度由`block_encryption_mode`决定(如128位) 2. **分组加密**: - 明文按16字节分块,PKCS7填充(若长度不足) - 每个块与前一个密文块异或(CBC模式) 3. **输出结果**: - 返回二进制格式密文(含填充字节) **2. 填充规则** - 默认使用**PKCS7填充**(如明文长度15字节 → 补1字节`0x01`) - 解密时自动去除填充 --- #### 四、代码示例与场景应用 **1. 基础加密/解密** ```sql -- 加密示例(ECB模式) INSERT INTO users (secret_data) VALUES (AES_ENCRYPT('信用卡号1234', 'my_secure_key_128')); -- 解密查询 SELECT AES_DECRYPT(secret_data, 'my_secure_key_128') FROM users WHERE id = 1; ``` **2. 使用CBC模式与IV** ```sql -- 设置加密模式 SET block_encryption_mode = 'aes-256-cbc'; -- 生成随机IV(16字节) SET @iv = RANDOM_BYTES(16); -- 加密(含IV) UPDATE payments SET encrypted_card = AES_ENCRYPT(card_number, '256bit_key', @iv) WHERE id = 100; ``` --- #### 五、安全注意事项 1. **密钥管理** - 禁止硬编码密钥(建议通过外部配置或KMS系统获取) - 定期轮换密钥(需重新加密历史数据)[^5] 2. **模式选择** - 避免使用ECB模式(无法隐藏数据模式) - 优先选择CBC(需随机IV)或GCM(支持认证加密) 3. **性能权衡** - 加密字段无法直接索引,需权衡查询效率 - 大数据量加密建议结合列压缩[^5] --- #### 六、与其他加密函数的对比 | 函数 | 算法 | 是否需要IV | 输出类型 | 典型场景 | |-----------------|--------|------------|---------------|------------------| | AES_ENCRYPT | AES | 可选 | 二进制字符串 | 结构化数据加密 | | MD5 | 哈希 | 无 | 十六进制字符串| 数据指纹校验 | | SHA2 | 哈希 | 无 | 十六进制字符串| 密码存储 | --- ### 相关问题 1. 如何检测MySQLAES_ENCRYPT使用的加密模式是否安全? 2. 在分布式系统中如何安全地同步AES加密的密钥和IV? 3. AES_ENCRYPT与OpenSSL命令行工具加密的数据如何互通? --- ### 引用标注 [^1]: 关于密钥一致性的说明 [^2]: AES密钥长度扩展机制 [^4]: IV在不同加密模式中的作用 [^5]: SQL级加密的应用场景与限制
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值