原文位址: http://www.work100.net/training/monolithic-frameworks-mybatis-encryption.html 更多教程: 光束雲 - 免費課程
知識點:資料加密與密碼
請參照如上
章節導航
進行閱讀
1.加密與解密
資料加密是計算機系統對資訊進行保護的一種最可靠的辦法。它利用密碼技術對資訊進行加密,實作資訊隐蔽,進而起到保護資訊的安全的作用。
加密
指通過
加密算法
和
加密密鑰
将
明文
轉變為
密文
解密
解密算法
解密密鑰
密文
恢複為
明文
。它的核心是
密碼學
。
2.加密算法
加密算法分為
對稱加密算法
、
非對稱加密算法
雜湊演算法
,對比如下:
秘鑰 | 算法舉例 | |
---|---|---|
對稱加密算法 | | |
非對稱加密算法 | | |
雜湊演算法 | | |
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.執行個體源碼
執行個體源碼已經托管到如下位址:
- https://github.com/work100-net/training-stage2/tree/master/iot-cloud2 https://github.com/work100-net/training-stage2/tree/master/iot-cloud2
- https://gitee.com/work100-net/training-stage2/tree/master/iot-cloud2 https://gitee.com/work100-net/training-stage2/tree/master/iot-cloud2
上一篇:
MyBatis 對象關系映射下一篇:
MyBatis 單表 CRUD 操作如果對課程内容感興趣,可以掃碼關注我們的或
公衆号
,及時關注我們的課程更新
QQ群
