<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    Mybatis:一個簡單配置搞定數據加密解密

    VSole2022-01-06 16:53:30

    一、背景

    在我們數據庫中有些時候會保存一些用戶的敏感信息,比如:手機號、銀行卡等信息,如果這些信息以明文的方式保存,那么是不安全的。假如:黑客黑進了數據庫,或者離職人員導出了數據,那么就可能導致這些敏感數據的泄漏。因此我們就需要找到一種方法來解決這個問題。

    二、解決方案

    由于我們系統中使用了Mybatis作為數據庫持久層,因此決定使用Mybatis的TypeHandler或Plugin來解決。

    TypeHandler : 需要我們在某些列上手動指定 typeHandler 來選擇使用那個typeHandler或者根據@MappedJdbcTypes@MappedTypes注解來自行推斷。

    "phone" property="phone" 
    typeHandler="com.huan.study.mybatis.typehandler.EncryptTypeHandler"/>
    

    Plugin : 可以攔截系統中的 select、insert、update、delete等語句,也能獲取到sql執行前的參數和執行后的數據。

    經過考慮,決定使用TypeHandler來加解密數據。

    三、需求

    我們有一張客戶表customer,里面有客戶手機號(phone)和客戶地址(address)等字段,其中客戶手機號(phone)是需要加密保存到數據庫中的。

    1、在添加客戶信息時,自動將客戶手機號加密保存到數據中。

    2、在查詢客戶信息時,自動解密客戶手機號。

    四、實現思路

    1、編寫一個實體類,凡是此實體類的數據都表示需要加解密的

    public class Encrypt {
        private String value;
    
        public Encrypt() {
        }
    
        public Encrypt(String value) {
            this.value = value;
        }
    
        public String getValue() {
            return value;
        }
    
        public void setValue(String value) {
            this.value = value;
        }
    }
    

    2、編寫一個加解密的TypeHandler

    • 設置參數時,加密數據。
    • 從數據庫獲取記錄時,解密數據。
    package com.huan.study.mybatis.typehandler;
    
    import cn.hutool.crypto.SecureUtil;
    import cn.hutool.crypto.symmetric.AES;
    import org.apache.ibatis.type.BaseTypeHandler;
    import org.apache.ibatis.type.JdbcType;
    import org.apache.ibatis.type.MappedJdbcTypes;
    import org.apache.ibatis.type.MappedTypes;
    
    import java.nio.charset.StandardCharsets;
    import java.sql.CallableStatement;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    /**
     * 加解密TypeHandler
     *
     * @author huan.fu 2021/5/18 - 上午9:20
     */
    @MappedJdbcTypes(JdbcType.VARCHAR)
    @MappedTypes(Encrypt.class)
    public class EncryptTypeHandler extends BaseTypeHandler {
    
        private static final byte[] KEYS = "12345678abcdefgh".getBytes(StandardCharsets.UTF_8);
    
        /**
         * 設置參數
         */
        @Override
        public void setNonNullParameter(PreparedStatement ps, int i, Encrypt parameter, JdbcType jdbcType) throws SQLException {
            if (parameter == null || parameter.getValue() == null) {
                ps.setString(i, null);
                return;
            }
            AES aes = SecureUtil.aes(KEYS);
            String encrypt = aes.encryptHex(parameter.getValue());
            ps.setString(i, encrypt);
        }
    
        /**
         * 獲取值
         */
        @Override
        public Encrypt getNullableResult(ResultSet rs, String columnName) throws SQLException {
            return decrypt(rs.getString(columnName));
        }
    
        /**
         * 獲取值
         */
        @Override
        public Encrypt getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
            return decrypt(rs.getString(columnIndex));
        }
    
        /**
         * 獲取值
         */
        @Override
        public Encrypt getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
            return decrypt(cs.getString(columnIndex));
        }
    
        public Encrypt decrypt(String value) {
            if (null == value) {
                return null;
            }
            return new Encrypt(SecureUtil.aes(KEYS).decryptStr(value));
        }
    }
    

    注意??:

    • @MappedTypes:表示該處理器處理的java類型是什么。
    • @MappedJdbcTypes:表示處理器處理的Jdbc類型。

    3、sql語句中寫法

    "1.0" encoding="UTF-8"?>
    "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    "com.huan.study.mybatis.mappers.CustomerMapper">
    
        "BaseResultMapper" type="com.huan.study.mybatis.entity.Customer">
            "id" property="id"/>
            "phone" property="phone"/>
            "address" property="address"/>
        
    
        "addCustomer">
            insert into customer(phone,address) values (#{phone},#{address})
        
    
        "findCustomer" resultMap="BaseResultMapper">
            select * from customer where phone = #{phone}
        
    
    
    

    SQL中沒有什么特殊的寫法。

    4、配置文件中指定Typehandler的包路徑

    mybatis.type-handlers-package=com.huan.study.mybatis.typehandler
    

    5、編寫后臺代碼

    • 提供一個添加方法
    • 提供一個根據手機號查詢的方法

    后臺代碼比較簡單,直接查看:

    https://gitee.com/huan1993/spring-cloud-parent/tree/master/mybatis/mybatis-typehandler-encrypt

    貼一個mapper層的截圖。

    圖片

    6、測試結果

    圖片

    從測試結果中可知,添加數據時,需要加密的數據(phone)在數據庫中已經加密了,在查詢的時候,加密的數據已經自動解密了。

    五、實現代碼

    https://gitee.com/huan1993/spring-cloud-parent/tree/master/mybatis/mybatis-typehandler-encrypt
    數據加密mybatis
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    在我們數據庫中有些時候會保存一些用戶的敏感信息,比如:手機號、銀行卡等信息,如果這些信息以明文的方式保存,那么是不安全的。假如:黑客黑進了數據庫,或者離職人員導出了數據,那么就可能導致這些敏感數據的泄漏。因此我們就需要找到一種方法來解決這個問題。
    數據所有者能夠根據授權用戶的屬性設置密文策略,在數據加密的同時保證授權的靈活性。針對量子計算的發展可能帶來的安全挑戰,基于格構造抗量子的方案可以有效提升安全性。此外,利用區塊鏈技術存儲數據信息,以應對非可信云服務的偽造、篡改數據等行為。最后,分析了方案的安全性與各方面性能,結果表明所提方案能夠適用于非可信的云存儲應用。
    作為一名開發人員,您希望確保數據的安全,并使其掌握在打算使用的一方手中。該庫促進了AndroidKeyStore的使用,同時使用了安全且眾所周知的加密原語。密鑰生成 Jetpack Security使用一個主密鑰,該主密鑰對用于每個加密操作的所有子密鑰進行加密。帶有BiometricPrompt的時限密鑰可以提供更高級別的保護,以防止設備被盜用。限時密鑰需要BiometricPrompt用于對稱密鑰的加密解密的授權。此標志在Android Pie及更高版本中可用。這對性能有輕微影響,但更安全。
    據《安全周刊》報道,安全研究人員在ENC安全公司開發的DataVault加密軟件中發現了兩個嚴重漏洞,從而可能導致使用該加密軟件的幾家主要供應商的存儲設備受到影響。這兩個漏洞已被分配CVE標識,分別是CVE-2021-36750和CVE-2021-36751。
    VPN:加密原理
    2021-09-14 07:35:10
    最原始的數據傳輸方式就是明文傳輸。所謂“明文”就是輸入什么在文件中最終也顯示什么,別人獲取到文件后就知道里面的全部內容了。很顯然,這種數據傳輸方式很不安全,被非法截取后,什么都暴露了。 隨后就有了加密傳輸的理念及相應的技術了,對原始的明文數據進行加密加密后生成的數據稱之為“密文”。密文與明文最大的區別就是打亂了原來明文數據中字符的順序,甚至生成一堆非字符信息(通常稱之為“亂碼”),其目的就是讓
    沒有云加密,就沒有云計算,因為數據丟失的風險太高—磁盤錯位、低強度密碼、網絡窺探或盜竊都會導致數據丟失。
    依照《網絡安全法》、《數據安全法》等相關法律法規,網絡運營者應當按照網絡安全等級保護制度的要求,采用數據加密等措施來防止網絡數據泄露或者被竊取、篡改。某音作為頭部的音樂創意短視頻社交平臺,每天都有數以億計的用戶在上面觀看、發布視頻,而這會產生大量包含個人賬號、密碼等用戶信息的敏感數據。若這些數據在傳輸過程中被黑客竊取或中途被篡改,將給用戶帶來巨大的隱私風險和損失。由此,為了響應相關政策,也為了給用
    近年來,全球范圍內數據泄露事件頻頻發生,而針對數據安全的傳統解決方法大都聚焦于通過數據加密、訪問控制等來嚴格控制數據的應用范圍,以降低數據泄露的風險,這明顯不能滿足當前數字經濟發展的需求。
    ShardingSphere 站在 數據庫的上層視角,關注他們之間的協作多于數據庫自身。連接、增量和可插拔是 Apache ShardingSphere 的核心概念。ShardingSphere-Proxy定位為透明化的數據庫代理端,提供封裝了數據庫二進制協議的服務端版本,用于完成對異構語言的支 持。
    攻擊者使用勒索軟件來加密屬于個人或組織的敏感數據。一旦他們打開文件,勒索軟件就會接管計算機系統并獲得管理員權限。它可以發出警報并阻止用戶活動,以減輕勒索軟件的影響。通過對最關鍵數據的實時監控,將能夠記錄和檢查數據活動流量,以檢測勒索軟件攻擊的早期跡象,并提醒您的安全團隊進行調查。但是,為了全面防范勒索軟件和其他威脅,需要除數據安全之外的各種工具。這樣,可以提高對企圖勒索軟件攻擊的響應速度和質量。
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类