使用Java實現(xiàn)價格加密與優(yōu)化功能
引言
在現(xiàn)代軟件開發(fā)中,數(shù)據(jù)加密是一個非常重要的環(huán)節(jié),尤其是在處理敏感信息(如價格、用戶數(shù)據(jù)等)時。本文將詳細(xì)介紹如何使用 Java 實現(xiàn)價格加密,并對代碼進(jìn)行優(yōu)化,以提高其健壯性、可維護(hù)性和性能。
1. 背景
在廣告交易系統(tǒng)中,價格信息通常需要加密以確保其安全性。Google 的 DoubleClick Ad Exchange 提供了一種加密方案,使用 HMAC-SHA1 算法對價格進(jìn)行加密。本文將基于這一方案,實現(xiàn)一個價格加密工具,并逐步優(yōu)化代碼。
2. 實現(xiàn)價格加密
2.1 加密原理
DoubleClick 的加密方案使用兩個密鑰:
- 加密密鑰(Encryption Key):用于加密價格數(shù)據(jù)。
- 完整性密鑰(Integrity Key):用于生成簽名,確保數(shù)據(jù)的完整性。
加密后的數(shù)據(jù)格式如下:
initVector:16 || E(payload:?) || I(signature:4)
其中:
initVector是初始化向量,包含時間戳和服務(wù)器 ID。E(payload)是加密后的價格數(shù)據(jù)。I(signature)是完整性簽名。
2.2 基礎(chǔ)實現(xiàn)
以下是基礎(chǔ)的價格加密實現(xiàn):
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class PriceEncryptor {
private static final String HMAC_ALGORITHM = "HmacSHA1";
/**
* 加密價格
*
* @param winPrice 價格字符串
* @param enKey 加密密鑰(Base64 編碼)
* @param ivKey 完整性密鑰(Base64 編碼)
* @return 加密后的價格字符串(Base64 編碼)
* @throws IllegalArgumentException 如果參數(shù)無效
* @throws RuntimeException 如果加密失敗
*/
public static String priceEncrypt(String winPrice, String enKey, String ivKey) {
// 參數(shù)校驗
Objects.requireNonNull(winPrice, "價格不能為空");
Objects.requireNonNull(enKey, "加密密鑰不能為空");
Objects.requireNonNull(ivKey, "完整性密鑰不能為空");
if (winPrice.trim().isEmpty()) {
throw new IllegalArgumentException("價格不能為空字符串");
}
try {
// 將價格轉(zhuǎn)換為 double
double priceValue = Double.parseDouble(winPrice);
// 解析密鑰
SecretKey encryptionKey = decodeBase64ToSecretKey(enKey, HMAC_ALGORITHM);
SecretKey integrityKey = decodeBase64ToSecretKey(ivKey, HMAC_ALGORITHM);
// 創(chuàng)建加密工具
DoubleClickCrypto.Keys keys = new DoubleClickCrypto.Keys(encryptionKey, integrityKey);
DoubleClickCrypto.Price crypto = new DoubleClickCrypto.Price(keys);
// 加密價格
return crypto.encodePriceValue(priceValue, null);
} catch (NumberFormatException e) {
throw new IllegalArgumentException("價格格式無效: " + winPrice, e);
} catch (Exception e) {
throw new RuntimeException("加密失敗", e);
}
}
/**
* 將 Base64 編碼的密鑰轉(zhuǎn)換為 SecretKey
*
* @param base64Key Base64 編碼的密鑰
* @param algorithm 密鑰算法
* @return SecretKey
* @throws IllegalArgumentException 如果密鑰無效
*/
private static SecretKey decodeBase64ToSecretKey(String base64Key, String algorithm) {
try {
byte[] keyBytes = Base64.getDecoder().decode(base64Key);
return new SecretKeySpec(keyBytes, algorithm);
} catch (IllegalArgumentException e) {
throw new IllegalArgumentException("無效的 Base64 密鑰: " + base64Key, e);
}
}
public static void main(String[] args) {
try {
String bidPrice = priceEncrypt("88", "your_base64_encoded_enKey", "your_base64_encoded_ivKey");
System.out.println("加密后價格:" + bidPrice);
} catch (Exception e) {
System.err.println("加密失敗: " + e.getMessage());
e.printStackTrace();
}
}
}
2.3 代碼說明
參數(shù)校驗:
- 使用
Objects.requireNonNull檢查winPrice、enKey和ivKey是否為null。 - 檢查
winPrice是否為空字符串。
- 使用
異常處理:
- 捕獲
NumberFormatException,提供清晰的錯誤信息。 - 捕獲其他異常,統(tǒng)一拋出
RuntimeException。
- 捕獲
密鑰解析:
- 將 Base64 編碼的密鑰轉(zhuǎn)換為
SecretKey。
- 將 Base64 編碼的密鑰轉(zhuǎn)換為
加密邏輯:
- 使用
DoubleClickCrypto.Price對價格進(jìn)行加密。
- 使用
3. 優(yōu)化代碼
3.1 參數(shù)校驗
在加密方法中,參數(shù)校驗是必不可少的。我們使用 Objects.requireNonNull 來確保參數(shù)不為 null,并檢查價格字符串是否為空。
Objects.requireNonNull(winPrice, "價格不能為空");
Objects.requireNonNull(enKey, "加密密鑰不能為空");
Objects.requireNonNull(ivKey, "完整性密鑰不能為空");
if (winPrice.trim().isEmpty()) {
throw new IllegalArgumentException("價格不能為空字符串");
}
3.2 異常處理
為了提供更好的錯誤信息,我們捕獲 NumberFormatException 并拋出 IllegalArgumentException。其他異常則統(tǒng)一拋出 RuntimeException。
try {
double priceValue = Double.parseDouble(winPrice);
// ...
} catch (NumberFormatException e) {
throw new IllegalArgumentException("價格格式無效: " + winPrice, e);
} catch (Exception e) {
throw new RuntimeException("加密失敗", e);
}
3.3 代碼復(fù)用
將密鑰解析邏輯封裝到 decodeBase64ToSecretKey 方法中,避免重復(fù)代碼。
private static SecretKey decodeBase64ToSecretKey(String base64Key, String algorithm) {
try {
byte[] keyBytes = Base64.getDecoder().decode(base64Key);
return new SecretKeySpec(keyBytes, algorithm);
} catch (IllegalArgumentException e) {
throw new IllegalArgumentException("無效的 Base64 密鑰: " + base64Key, e);
}
}
3.4 性能優(yōu)化
如果 priceEncrypt 方法會被頻繁調(diào)用,可以考慮將 DoubleClickCrypto.Keys 和 DoubleClickCrypto.Price 的實例緩存起來,避免重復(fù)創(chuàng)建。
private static final Map<String, DoubleClickCrypto.Price> CRYPTO_CACHE = new ConcurrentHashMap<>();
private static DoubleClickCrypto.Price getCrypto(String enKey, String ivKey) {
String cacheKey = enKey + "|" + ivKey;
return CRYPTO_CACHE.computeIfAbsent(cacheKey, k -> {
SecretKey encryptionKey = decodeBase64ToSecretKey(enKey, HMAC_ALGORITHM);
SecretKey integrityKey = decodeBase64ToSecretKey(ivKey, HMAC_ALGORITHM);
DoubleClickCrypto.Keys keys = new DoubleClickCrypto.Keys(encryptionKey, integrityKey);
return new DoubleClickCrypto.Price(keys);
});
}
然后在 priceEncrypt 方法中使用 getCrypto 獲取 DoubleClickCrypto.Price 實例。
DoubleClickCrypto.Price crypto = getCrypto(enKey, ivKey); return crypto.encodePriceValue(priceValue, null);
4. 總結(jié)
通過以上步驟,我們實現(xiàn)了一個健壯、高效的價格加密工具。優(yōu)化后的代碼具有以下優(yōu)點:
- 健壯性:通過參數(shù)校驗和異常處理,確保代碼在異常情況下也能正常運行。
- 可維護(hù)性:通過代碼復(fù)用和模塊化設(shè)計,提高了代碼的可讀性和可維護(hù)性。
- 性能:通過緩存加密工具實例,減少了重復(fù)創(chuàng)建對象的開銷。
到此這篇關(guān)于使用Java實現(xiàn)價格加密與優(yōu)化功能的文章就介紹到這了,更多相關(guān)Java價格加密與優(yōu)化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Springcloud RestTemplate服務(wù)調(diào)用代碼實例
這篇文章主要介紹了Springcloud RestTemplate服務(wù)調(diào)用代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-08-08
SpringBoot實現(xiàn)緩存組件配置動態(tài)切換的步驟詳解
現(xiàn)在有多個springboot項目,但是不同的項目中使用的緩存組件是不一樣的,有的項目使用redis,有的項目使用ctgcache,現(xiàn)在需要用同一套代碼通過配置開關(guān),在不同的項目中切換這兩種緩存,本文介紹了SpringBoot實現(xiàn)緩存組件配置動態(tài)切換的步驟,需要的朋友可以參考下2024-07-07
基于SpringBoot實現(xiàn)一個有趣好玩的年會抽獎系統(tǒng)
年會抽獎是每個企業(yè)年末的重要活動,本文將基于SpringBoot框架,設(shè)計并實現(xiàn)一個公正、有趣、好玩的年會抽獎系統(tǒng),確保抽獎過程的透明性和隨機(jī)性,同時增加多種互動功能,有需要的可以了解下2026-02-02
mybatis中string和date的轉(zhuǎn)換方式
這篇文章主要介紹了mybatis中string和date的轉(zhuǎn)換方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08
prometheus監(jiān)控springboot應(yīng)用簡單使用介紹詳解
這篇文章主要介紹了prometheus監(jiān)控springboot應(yīng)用簡單使用介紹詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-05-05
Java利用StampedLock實現(xiàn)讀寫鎖的方法詳解
在jdk8以后,java提供了一個性能更優(yōu)越的讀寫鎖并發(fā)類StampedLock,該類的設(shè)計初衷是作為一個內(nèi)部工具類,用于輔助開發(fā)其它線程安全組件。本文就來和大家一起學(xué)習(xí)下StampedLock的功能和使用2022-10-10
創(chuàng)建Spring Boot項目的幾種方式總結(jié)(推薦)
這篇文章主要介紹了創(chuàng)建Spring Boot項目的幾種方式總結(jié)(推薦),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-07-07

