天天看點

Java單體應用 - 常用架構 - 08.MyBatis - 知識點:資料加密與密碼知識點:資料加密與密碼

原文位址: http://www.work100.net/training/monolithic-frameworks-mybatis-encryption.html 更多教程: 光束雲 - 免費課程

知識點:資料加密與密碼

請參照如上

章節導航

進行閱讀

1.加密與解密

資料加密是計算機系統對資訊進行保護的一種最可靠的辦法。它利用密碼技術對資訊進行加密,實作資訊隐蔽,進而起到保護資訊的安全的作用。

加密

指通過

加密算法

加密密鑰

明文

轉變為

密文

解密

解密算法

解密密鑰

密文

恢複為

明文

。它的核心是

密碼學

2.加密算法

加密算法分為

對稱加密算法

非對稱加密算法

雜湊演算法

,對比如下:

秘鑰 算法舉例
對稱加密算法

密鑰相同

DES

3DES

AES

非對稱加密算法

密鑰不同

RSA

DSA

雜湊演算法

不需要密鑰

MD5

SHA-1

SHA256

3.密碼實作方案

明文存儲

密碼完全使用明文,将明文密碼直接存儲到資料中,此種方案存在很大安全風險,資料一旦洩露,使用者的密碼将一起被洩露出去。

密文存儲

對密碼明文進行加密,通常我們使用

雜湊演算法

進行加密,将加密後的密文密碼存儲至資料庫,這樣即使發生資料洩露,外界也不知道明文密碼。

但此種方案也存在一定的安全風險,有一種叫做

撞庫

技術能夠破解密文密碼,即:當密文密碼遭到洩露時,黑客可以通過網絡上公開的密文與明文資料庫進行密文對比,進而得到明文。

加鹽加密

為了解決

撞庫

的風險,我們對加密方案進行了更新,在加密時引入一個

幹擾串

(即:

鹽(salt)

),該幹擾串

随機生成

比如以

MD5

加密算法舉例,其主要實作思路為:

密碼密文

=

MD5( 鹽 + 密碼明文)

4.加密工具類

我們提供了課程所使用的加密與解密的工具類,在項目

iot-cloud-commons

下新增一個

EncryptionUtils

類,代碼如下:

package net.work100.training.stage2.iot.cloud.commons.utils;

import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.DigestUtils;

/**
 * <p>Title: EncryptionUtils</p>
 * <p>Description: </p>
 * <p>Url: http://www.work100.net/training/monolithic-frameworks-mybatis.html</p>
 *
 * @author liuxiaojun
 * @date 2020-02-24 10:41
 * ------------------- History -------------------
 * <date>      <author>       <desc>
 * 2020-02-24   liuxiaojun     初始建立
 * -----------------------------------------------
 */
public class EncryptionUtils {
    private static final int SALT_LENGTH = 6;
    private static final String SEPARATOR = "#";

    public enum EncryptionType {
        MD5("md5"),
        SHA256("sha256");

        private String type;

        EncryptionType(String type) {
            this.type = type;
        }

        public String getType() {
            return this.type;
        }

        public static EncryptionType getEncryptionType(String type) {
            if (StringUtils.isEmpty(type)) {
                return MD5;
            }
            for (EncryptionType encryptionType : EncryptionType.values()) {
                if (encryptionType.type.equalsIgnoreCase(type)) {
                    return encryptionType;
                }
            }
            return MD5;
        }
    }

    /**
     * 加密文本
     *
     * @param encryptionType 加密方式
     * @param sourceText     原文(區分大小寫)
     * @return
     */
    public static String encryptText(EncryptionType encryptionType, String sourceText) {
        String encryptedText = "";
        switch (encryptionType) {
            case MD5:
                encryptedText = DigestUtils.md5DigestAsHex(sourceText.getBytes());
                break;
            case SHA256:
                break;
            default:
                encryptedText = DigestUtils.md5DigestAsHex(sourceText.getBytes());
                break;
        }
        return encryptedText;
    }

    /**
     * 加密密碼
     *
     * @param encryptionType 加密方式
     * @param sourcePassword 明文密碼
     * @return
     */
    public static String encryptPassword(EncryptionType encryptionType, String sourcePassword) {
        String salt = RandomStringUtils.randomAlphanumeric(SALT_LENGTH);
        sourcePassword = String.format("%s%s", sourcePassword, salt);
        String encryptedPassword = encryptText(encryptionType, sourcePassword);
        return String.format("%s%s%s%s%s", encryptionType.getType(), SEPARATOR, salt, SEPARATOR, encryptedPassword);
    }

    /**
     * 驗證加密文本
     *
     * @param encryptionType 加密類型
     * @param sourceText     原文
     * @param encryptedText  密文
     * @return
     */
    public static boolean validateEncryptText(EncryptionType encryptionType, String sourceText, String encryptedText) {
        return encryptText(encryptionType, sourceText).equals(encryptedText);
    }

    /**
     * 驗證密碼
     *
     * @param sourcePassword    明文密碼
     * @param encryptedPassword 加密後組合串
     * @return
     */
    public static boolean validateEncryptPassword(String sourcePassword, String encryptedPassword) {
        try {
            String[] split = encryptedPassword.split(SEPARATOR);
            EncryptionType encryptionType = EncryptionType.getEncryptionType(split[0]);
            String salt = split[1];
            encryptedPassword = split[2];
            sourcePassword = String.format("%s%s", sourcePassword, salt);
            return encryptText(encryptionType, sourcePassword).equals(encryptedPassword);
        } catch (Exception ex) {
            return false;
        }
    }
}           

代碼依賴了

org.apache.commons:commons-lang3

org.springframework

,是以我需要調整

iot-cloud-commons

pom.xml

檔案,代碼如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>net.work100.training.stage2</groupId>
        <artifactId>iot-cloud-dependencies</artifactId>
        <version>1.0.0-SNAPSHOT</version>
        <relativePath>../iot-cloud-dependencies/pom.xml</relativePath>
    </parent>

    <artifactId>iot-cloud-commons</artifactId>
    <packaging>jar</packaging>

    <name>iot-cloud-commons</name>
    <description></description>

    <dependencies>
        <!-- Spring Begin -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
        </dependency>
        <!-- Spring End -->

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
    </dependencies>
</project>           

5.執行個體源碼

執行個體源碼已經托管到如下位址:

上一篇:

MyBatis 對象關系映射

下一篇:

MyBatis 單表 CRUD 操作
如果對課程内容感興趣,可以掃碼關注我們的

公衆号

QQ群

,及時關注我們的課程更新
Java單體應用 - 常用架構 - 08.MyBatis - 知識點:資料加密與密碼知識點:資料加密與密碼
Java單體應用 - 常用架構 - 08.MyBatis - 知識點:資料加密與密碼知識點:資料加密與密碼