Mybatis數據庫字段加解密1-使用mysql自帶加密方法

系列文章

  1. Mybatis數據庫字段加解密1-使用mysql自帶加密方法
  2. Mybatis數據庫字段加解密2-使用typeAlias實現

簡介

本文以用戶表為例,介紹如何在Mybatis的mapper.xml中對MySql數據庫表的字段進行加解密。主要包括設置和獲取全局變量和加密方法使用。

定義SqlSession全局變量

// import org.apache.ibatis.session.Configuration
final String key = "AES_KEY"; // sqlSession中全局屬性kv中的key
String aesKey = "aesKey"; // aes加密使用的key
Configuration configuration = new Configuration(environment);
configuration.setMapUnderscoreToCamelCase(true); //數據庫中下劃線方式的鍵將映射到java pojo中的駝峰命名法的屬性。如user_id映射為userId。
// 將全局變量存入sqlSession
configuration.getVariables().put(key, aesKey);
...
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);

獲取全局變量

  • java方式
sqlSessionFactory.getConfiguration().getVariables().get(key)
  • 動態(tài)SQL方式
'${AES_KEY}'

UserMapper.xml加解密username等字段

  • 加密過程:先將字段轉化為16進制格式的字符串表示,再進行AES加密。
  • 解密過程:先將字段使用加密時的key進行解密,再將中間值從16進制字符串還原為原來的值。
<sql id="decryptGetColumns">
         user_id, password,
         AES_DECRYPT(unhex(username), '${AES_KEY}') username,
         AES_DECRYPT(unhex(nickname), '${AES_KEY}') nickname,
         AES_DECRYPT(unhex(phone), '${AES_KEY}') phone,
         AES_DECRYPT(unhex(email), '${AES_KEY}') email,
         register_time, source, local_lang, account_status, country, province, city, sex, age
</sql>
 <!-- 添加用戶,加密字段-->
 <insert id="addUser" parameterType="com.scut.emos.entity.User">
      INSERT INTO user_t(user_id, username, password, nickname, phone, email, register_time, source, local_lang,
    account_status, country, province, city, sex, age)
      VALUES (#{userId},
        hex(AES_ENCRYPT(#{username}, '${AES_KEY}')),
        #{password},
        hex(AES_ENCRYPT(#{nickname}, '${AES_KEY}')),
        hex(AES_ENCRYPT(#{phone},  '${AES_KEY}')),
        hex(AES_ENCRYPT(#{email}, '${AES_KEY}')),
        #{registerTime}, #{source}, #{localLang}, #{accountStatus}, #{country}, #{province}, #{city}, #{sex}, #{age});
</insert>
 <!-- 查詢用戶,解密字段-->
<select id="getUserByUserId" parameterType="Long" resultType="com.scut.emos.entity.User">
        SELECT
        <include refid="decryptGetColumns"/>
        FROM user_t
        WHERE user_id = #{userId}
        LIMIT 1
</select>
 <select id="getUserByUsername" parameterType="String" resultType="com.scut.emos.entity.User">
        SELECT
        <include refid="decryptGetColumns"/>
        FROM user_t
        WHERE username = hex(AES_ENCRYPT(#{username}, '${AES_KEY}'))
        LIMIT 1;
 </select>

參考文獻


本文作者: seawish
版權聲明: 本博客所有文章除特別聲明外,均采用 CC BY-NC-SA 3.0 許可協(xié)議。轉載請注明出處!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1. 簡介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存儲過程以及高級映射的優(yōu)秀的...
    笨鳥慢飛閱讀 5,571評論 0 4
  • 1 引言# 本文主要講解JDBC怎么演變到Mybatis的漸變過程,重點講解了為什么要將JDBC封裝成Mybait...
    七寸知架構閱讀 76,574評論 36 980
  • 1 緩存介紹# MyBatis支持聲明式數據緩存(declarative data caching)。當一條SQL...
    七寸知架構閱讀 2,159評論 2 51
  • 感覺好久好久沒有交過新朋友了,有時候想:到底是我性格孤僻還是看起來太高冷,讓人不由自主的抵觸.....說實在...
    筱千金閱讀 365評論 0 3
  • Ant Design 是什么 AntDesign(簡稱Antd): 是螞蟻金服開發(fā)和服務于企業(yè)級后臺產品。 Ant...
    超級大柱子閱讀 1,177評論 0 3