最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Java實(shí)現(xiàn)價(jià)格加密與優(yōu)化功能

 更新時(shí)間:2025年01月20日 08:31:22   作者:碼農(nóng)阿豪@新空間代碼工作室  
在現(xiàn)代軟件開發(fā)中,數(shù)據(jù)加密是一個(gè)非常重要的環(huán)節(jié),尤其是在處理敏感信息(如價(jià)格、用戶數(shù)據(jù)等)時(shí),本文將詳細(xì)介紹如何使用?Java?實(shí)現(xiàn)價(jià)格加密,并對(duì)代碼進(jìn)行優(yōu)化,需要的朋友可以參考下

引言

在現(xiàn)代軟件開發(fā)中,數(shù)據(jù)加密是一個(gè)非常重要的環(huán)節(jié),尤其是在處理敏感信息(如價(jià)格、用戶數(shù)據(jù)等)時(shí)。本文將詳細(xì)介紹如何使用 Java 實(shí)現(xiàn)價(jià)格加密,并對(duì)代碼進(jìn)行優(yōu)化,以提高其健壯性、可維護(hù)性和性能。

1. 背景

在廣告交易系統(tǒng)中,價(jià)格信息通常需要加密以確保其安全性。Google 的 DoubleClick Ad Exchange 提供了一種加密方案,使用 HMAC-SHA1 算法對(duì)價(jià)格進(jìn)行加密。本文將基于這一方案,實(shí)現(xiàn)一個(gè)價(jià)格加密工具,并逐步優(yōu)化代碼。

2. 實(shí)現(xiàn)價(jià)格加密

2.1 加密原理

DoubleClick 的加密方案使用兩個(gè)密鑰:

  • 加密密鑰(Encryption Key):用于加密價(jià)格數(shù)據(jù)。
  • 完整性密鑰(Integrity Key):用于生成簽名,確保數(shù)據(jù)的完整性。

加密后的數(shù)據(jù)格式如下:

initVector:16 || E(payload:?) || I(signature:4)

其中:

  • initVector 是初始化向量,包含時(shí)間戳和服務(wù)器 ID。
  • E(payload) 是加密后的價(jià)格數(shù)據(jù)。
  • I(signature) 是完整性簽名。

2.2 基礎(chǔ)實(shí)現(xiàn)

以下是基礎(chǔ)的價(jià)格加密實(shí)現(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";

    /**
     * 加密價(jià)格
     *
     * @param winPrice 價(jià)格字符串
     * @param enKey    加密密鑰(Base64 編碼)
     * @param ivKey    完整性密鑰(Base64 編碼)
     * @return 加密后的價(jià)格字符串(Base64 編碼)
     * @throws IllegalArgumentException 如果參數(shù)無效
     * @throws RuntimeException         如果加密失敗
     */
    public static String priceEncrypt(String winPrice, String enKey, String ivKey) {
        // 參數(shù)校驗(yàn)
        Objects.requireNonNull(winPrice, "價(jià)格不能為空");
        Objects.requireNonNull(enKey, "加密密鑰不能為空");
        Objects.requireNonNull(ivKey, "完整性密鑰不能為空");

        if (winPrice.trim().isEmpty()) {
            throw new IllegalArgumentException("價(jià)格不能為空字符串");
        }

        try {
            // 將價(jià)格轉(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);

            // 加密價(jià)格
            return crypto.encodePriceValue(priceValue, null);
        } catch (NumberFormatException e) {
            throw new IllegalArgumentException("價(jià)格格式無效: " + 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("加密后價(jià)格:" + bidPrice);
        } catch (Exception e) {
            System.err.println("加密失敗: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

2.3 代碼說明

  1. 參數(shù)校驗(yàn)

    • 使用 Objects.requireNonNull 檢查 winPriceenKey 和 ivKey 是否為 null。
    • 檢查 winPrice 是否為空字符串。
  2. 異常處理

    • 捕獲 NumberFormatException,提供清晰的錯(cuò)誤信息。
    • 捕獲其他異常,統(tǒng)一拋出 RuntimeException。
  3. 密鑰解析

    • 將 Base64 編碼的密鑰轉(zhuǎn)換為 SecretKey
  4. 加密邏輯

    • 使用 DoubleClickCrypto.Price 對(duì)價(jià)格進(jìn)行加密。

3. 優(yōu)化代碼

3.1 參數(shù)校驗(yàn)

在加密方法中,參數(shù)校驗(yàn)是必不可少的。我們使用 Objects.requireNonNull 來確保參數(shù)不為 null,并檢查價(jià)格字符串是否為空。

Objects.requireNonNull(winPrice, "價(jià)格不能為空");
Objects.requireNonNull(enKey, "加密密鑰不能為空");
Objects.requireNonNull(ivKey, "完整性密鑰不能為空");

if (winPrice.trim().isEmpty()) {
    throw new IllegalArgumentException("價(jià)格不能為空字符串");
}

3.2 異常處理

為了提供更好的錯(cuò)誤信息,我們捕獲 NumberFormatException 并拋出 IllegalArgumentException。其他異常則統(tǒng)一拋出 RuntimeException。

try {
    double priceValue = Double.parseDouble(winPrice);
    // ...
} catch (NumberFormatException e) {
    throw new IllegalArgumentException("價(jià)格格式無效: " + 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 方法會(huì)被頻繁調(diào)用,可以考慮將 DoubleClickCrypto.Keys 和 DoubleClickCrypto.Price 的實(shí)例緩存起來,避免重復(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 實(shí)例。

DoubleClickCrypto.Price crypto = getCrypto(enKey, ivKey);
return crypto.encodePriceValue(priceValue, null);

4. 總結(jié)

通過以上步驟,我們實(shí)現(xiàn)了一個(gè)健壯、高效的價(jià)格加密工具。優(yōu)化后的代碼具有以下優(yōu)點(diǎn):

  • 健壯性:通過參數(shù)校驗(yàn)和異常處理,確保代碼在異常情況下也能正常運(yùn)行。
  • 可維護(hù)性:通過代碼復(fù)用和模塊化設(shè)計(jì),提高了代碼的可讀性和可維護(hù)性。
  • 性能:通過緩存加密工具實(shí)例,減少了重復(fù)創(chuàng)建對(duì)象的開銷。

到此這篇關(guān)于使用Java實(shí)現(xiàn)價(jià)格加密與優(yōu)化功能的文章就介紹到這了,更多相關(guān)Java價(jià)格加密與優(yōu)化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java編程泛型限定代碼分享

    Java編程泛型限定代碼分享

    這篇文章主要介紹了Java編程泛型限定的相關(guān)內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-10-10
  • Java解決程序包不存在的問題解決

    Java解決程序包不存在的問題解決

    在Java編程中,我們可以使用Maven或Gradle等構(gòu)建工具來管理依賴庫,本文主要介紹了Java解決程序包不存在的問題解決,具有一定的參考價(jià)值,感興趣的可以了解 一下
    2023-12-12
  • Springcloud RestTemplate服務(wù)調(diào)用代碼實(shí)例

    Springcloud RestTemplate服務(wù)調(diào)用代碼實(shí)例

    這篇文章主要介紹了Springcloud RestTemplate服務(wù)調(diào)用代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • SpringBoot實(shí)現(xiàn)緩存組件配置動(dòng)態(tài)切換的步驟詳解

    SpringBoot實(shí)現(xiàn)緩存組件配置動(dòng)態(tài)切換的步驟詳解

    現(xiàn)在有多個(gè)springboot項(xiàng)目,但是不同的項(xiàng)目中使用的緩存組件是不一樣的,有的項(xiàng)目使用redis,有的項(xiàng)目使用ctgcache,現(xiàn)在需要用同一套代碼通過配置開關(guān),在不同的項(xiàng)目中切換這兩種緩存,本文介紹了SpringBoot實(shí)現(xiàn)緩存組件配置動(dòng)態(tài)切換的步驟,需要的朋友可以參考下
    2024-07-07
  • 基于SpringBoot實(shí)現(xiàn)一個(gè)有趣好玩的年會(huì)抽獎(jiǎng)系統(tǒng)

    基于SpringBoot實(shí)現(xiàn)一個(gè)有趣好玩的年會(huì)抽獎(jiǎng)系統(tǒng)

    年會(huì)抽獎(jiǎng)是每個(gè)企業(yè)年末的重要活動(dòng),本文將基于SpringBoot框架,設(shè)計(jì)并實(shí)現(xiàn)一個(gè)公正、有趣、好玩的年會(huì)抽獎(jiǎng)系統(tǒng),確保抽獎(jiǎng)過程的透明性和隨機(jī)性,同時(shí)增加多種互動(dòng)功能,有需要的可以了解下
    2026-02-02
  • mybatis中string和date的轉(zhuǎn)換方式

    mybatis中string和date的轉(zhuǎn)換方式

    這篇文章主要介紹了mybatis中string和date的轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • prometheus監(jiān)控springboot應(yīng)用簡(jiǎn)單使用介紹詳解

    prometheus監(jiān)控springboot應(yīng)用簡(jiǎn)單使用介紹詳解

    這篇文章主要介紹了prometheus監(jiān)控springboot應(yīng)用簡(jiǎn)單使用介紹詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-05-05
  • Java利用StampedLock實(shí)現(xiàn)讀寫鎖的方法詳解

    Java利用StampedLock實(shí)現(xiàn)讀寫鎖的方法詳解

    在jdk8以后,java提供了一個(gè)性能更優(yōu)越的讀寫鎖并發(fā)類StampedLock,該類的設(shè)計(jì)初衷是作為一個(gè)內(nèi)部工具類,用于輔助開發(fā)其它線程安全組件。本文就來和大家一起學(xué)習(xí)下StampedLock的功能和使用
    2022-10-10
  • 創(chuàng)建Spring Boot項(xiàng)目的幾種方式總結(jié)(推薦)

    創(chuàng)建Spring Boot項(xiàng)目的幾種方式總結(jié)(推薦)

    這篇文章主要介紹了創(chuàng)建Spring Boot項(xiàng)目的幾種方式總結(jié)(推薦),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-07-07
  • 一文弄懂fastjson

    一文弄懂fastjson

    fastjson?是一個(gè)java語言編寫的高性能且功能完善的JSON庫,本文主要介紹了fastjson的使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-05-05

最新評(píng)論

雷州市| 东方市| 河津市| 三亚市| 辽阳县| 兴仁县| 抚宁县| 鹤岗市| 新河县| 五台县| 若尔盖县| 潼南县| 鄂伦春自治旗| 四会市| 华容县| 海原县| 高邑县| 三台县| 波密县| 辽阳市| 十堰市| 武隆县| 祁阳县| 商水县| 诏安县| 海城市| 泰宁县| 凌云县| 临洮县| 朝阳市| 绥阳县| 蓬莱市| 汾西县| 墨脱县| 娄底市| 梁平县| 合肥市| 巴塘县| 蓬安县| 高清| 尚义县|