加密與安全_探索口令加密算法(PBE)

文章目錄

  • 概述
  • 疑問
  • PBE 算法 ( Password Based Encryption)
  • Code
    • POM
    • 實現
  • 小結

在這里插入圖片描述


概述

加密與安全_探索對稱加密算法中我們提到AES加密密鑰長度是固定的128/192/256位,而不是我們用WinZip/WinRAR那樣,隨便輸入幾位都可以。

這是因為對稱加密算法決定了口令必須是固定長度,然后對明文進行分塊加密。又因為安全需求,口令長度往往都是128位以上,即至少16個字符。


疑問

我們平時使用的加密軟件,輸入6位、8位都可以,難道是加密方式不一樣嗎?

用戶輸入的口令往往不能直接作為AES的密鑰進行加密,因為它們的長度通常不符合AES密鑰的要求,而且可能存在規律性,容易受到字典攻擊等安全威脅。

為了解決這個問題,通常會使用PBE算法,采用隨機數雜湊計算出真正的密鑰,再進行加密。。


PBE 算法 ( Password Based Encryption)

PBE算法(Password-Based Encryption)是一種安全的密碼基礎加密算法,用于將用戶輸入的口令轉換為符合要求的密鑰,以便進行加密操作。 在使用PBE算法時,用戶只需輸入一個口令,而不需要直接提供一個符合要求的密鑰。PBE算法的作用是通過結合用戶輸入的口令和一個安全隨機生成的鹽值,采用雜湊計算的方式生成最終的密鑰。

通俗的可以理解為下面的函數:

key = generate(userPassword, secureRandomPassword);

以AES密鑰生成為例,用戶只需輸入一個口令,而不需要擔心口令的長度和復雜度是否符合要求。PBE算法會在內部生成一個安全的隨機數作為鹽值,并將用戶輸入的口令與鹽值一起進行雜湊計算,從而生成一個符合AES加密算法要求的真正密鑰。

通過這種方式,PBE算法實現了對用戶口令的保護,同時確保生成的密鑰符合加密算法的要求,從而提高了整個加密系統的安全性。


Code

POM

   <dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.68</version></dependency>

實現

package com.artisan.securityalgjava.peb;import org.bouncycastle.jce.provider.BouncyCastleProvider;import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;
import java.math.BigInteger;
import java.security.GeneralSecurityException;
import java.security.SecureRandom;
import java.security.Security;
import java.util.Base64;/*** @author 小工匠* @version 1.0* @mark: show me the code , change the world* 使用PBE算法進行加密和解密示例*/
public class PBEExample {public static void main(String[] args) throws Exception {// 將BouncyCastle作為Provider添加到java.security:Security.addProvider(new BouncyCastleProvider());// 原文:String message = "Hello, world!";// 加密口令:String password = "hello12345";// 16 bytes隨機Salt:byte[] salt = SecureRandom.getInstanceStrong().generateSeed(16);System.out.printf("salt: %032x\n", new BigInteger(1, salt));// 加密:byte[] data = message.getBytes("UTF-8");byte[] encrypted = encrypt(password, salt, data);System.out.println("encrypted: " + Base64.getEncoder().encodeToString(encrypted));// 解密:byte[] decrypted = decrypt(password, salt, encrypted);System.out.println("decrypted: " + new String(decrypted, "UTF-8"));}// 加密:public static byte[] encrypt(String password, byte[] salt, byte[] input) throws GeneralSecurityException {// 使用口令生成PBEKeySpec對象PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray());// 創建密鑰工廠SecretKeyFactory skeyFactory = SecretKeyFactory.getInstance("PBEwithSHA1and128bitAES-CBC-BC");// 生成密鑰對象SecretKey skey = skeyFactory.generateSecret(keySpec);// 創建PBE參數對象PBEParameterSpec pbeps = new PBEParameterSpec(salt, 1000);// 創建加密器Cipher cipher = Cipher.getInstance("PBEwithSHA1and128bitAES-CBC-BC");// 初始化加密器cipher.init(Cipher.ENCRYPT_MODE, skey, pbeps);// 執行加密操作return cipher.doFinal(input);}// 解密:public static byte[] decrypt(String password, byte[] salt, byte[] input) throws GeneralSecurityException {// 使用口令生成PBEKeySpec對象PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray());// 創建密鑰工廠SecretKeyFactory skeyFactory = SecretKeyFactory.getInstance("PBEwithSHA1and128bitAES-CBC-BC");// 生成密鑰對象SecretKey skey = skeyFactory.generateSecret(keySpec);// 創建PBE參數對象PBEParameterSpec pbeps = new PBEParameterSpec(salt, 1000);// 創建解密器Cipher cipher = Cipher.getInstance("PBEwithSHA1and128bitAES-CBC-BC");// 初始化解密器cipher.init(Cipher.DECRYPT_MODE, skey, pbeps);// 執行解密操作return cipher.doFinal(input);}
}

在使用PBE時,引入BouncyCastle提供了更多的加密算法支持,并且可以使用其中的PBE算法。

  • 指定算法為PBEwithSHA1and128bitAES-CBC-BC表明了我們使用SHA1和128位AES加密算法結合的PBE算法。

  • 真正的AES密鑰是在調用Cipher#init()方法時同時傳入SecretKeyPBEParameterSpec實現的。在創建PBEParameterSpec時,我們指定了循環次數為1000。循環次數的增加可以增加破解所需的計算量,從而提高加密的安全性。

  • 如果我們固定了salt和循環次數,就得到了一個通用的“口令”加密軟件。用戶只需要輸入口令,程序就可以使用固定的salt和循環次數來加密和解密數據。

  • 如果我們將隨機生成的salt存儲在U盤中,就可以得到一個“口令”加USB Key的加密軟件。這種方式的好處在于,即使用戶使用了一個非常弱的口令,沒有U盤也無法解密,因為U盤存儲的隨機數密鑰具有很高的安全性。


小結

  • PBE算法(Password-Based Encryption)通過用戶輸入的口令和一個安全的隨機salt結合,經過多次迭代的雜湊計算生成最終的密鑰(Key),然后再使用這個密鑰進行加密操作。這種方式的安全性得到了顯著提高,因為即使用戶輸入的口令較弱,通過引入隨機salt和多次迭代的雜湊計算,生成的密鑰也具有足夠的復雜性和隨機性,從而增加了破解的難度。

  • PBE算法內部使用的仍然是標準的對稱加密算法,例如AES。生成的密鑰(Key)是由用戶口令和隨機salt計算得出的,然后再傳遞給底層的對稱加密算法進行加密和解密操作。這種結構既保留了對稱加密算法的高效性和快速性,又通過PBE算法增加了用戶口令的安全性,使得整個加密過程更加安全可靠。

總之,PBE算法通過結合用戶口令和安全的隨機salt,生成一個復雜且安全的密鑰,進而增強了對稱加密算法的安全性,為數據加密提供了更加可靠的保障。

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/714449.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/714449.shtml
英文地址,請注明出處:http://en.pswp.cn/news/714449.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2024最新算法:斑翠鳥優化算法(Pied Kingfisher Optimizer ,PKO)求解23個基準函數

一、斑翠鳥優化算法 斑翠鳥優化算法&#xff08;Pied Kingfisher Optimizer ,PKO&#xff09;&#xff0c;是由Abdelazim Hussien于2024年提出的一種基于群體的新型元啟發式算法&#xff0c;它從自然界中觀察到的斑翠鳥獨特的狩獵行為和共生關系中汲取靈感。PKO 算法圍繞三個不…

【Ubuntu操作系統】講解

Ubuntu操作系統 1. 前言2. 系統更新3. 安裝編譯工具4. 安裝文本編輯器4.1 Vim4.2 Visual Studio Code 5. 安裝開發庫6. 安裝版本控制系統6.1 Git 7. 安裝數據庫7.1 MySQL7.2 PostgreSQL 8. 安裝編程語言環境8.1 Python8.2 Node.js 9. 安裝其他常用軟件9.1 Chrome瀏覽器9.2 Dock…

MySQL數據庫引擎,以及常用引擎的區別

先看圖&#xff1a; mysql常用引擎包括&#xff1a;MYISAM、Innodb、Memory、MERGE MYISAM&#xff1a; 全表鎖&#xff0c;擁有較高的執行速度&#xff0c;不支持事務&#xff0c;不支持外鍵&#xff0c;并發性能差&#xff0c;占用空間相對較小&#xff0c;對事務完整性沒有…

SpringBoot整合rabbitmq-主題交換機隊列(四)

說明&#xff1a;Topic主題交換機它的大致流程是交換機和一個或者多個隊列綁定&#xff0c;這個綁定的Routingkey是包含通配符的&#xff0c;滿足通配符的隊列會接收到消息。 通配符規則&#xff1a; #&#xff1a;匹配一個或多個詞 *&#xff1a;匹配一個詞 例如&#xff…

2024洗地機深度測評推薦,洗地機哪款值得入手?新手入門必看洗地機選購技巧

洗地機是近年來備受矚目的智能家居產品&#xff0c;它能夠有效地幫助我們節省勞動時間&#xff0c;高效清潔地面&#xff0c;從而減輕我們的勞動負擔。洗地機實現了掃地和拖地的一體化功能&#xff0c;在掃地的同時還能順便完成地面的拖洗工作。配備水箱的設計使得不再需要頻繁…

【kubernetes VPA】記錄一次安裝 VPA 相關組件的報錯解決過程

文章目錄 1. 問題描述2. 問題原因3. 解決辦法4. 參考鏈接 1. 問題描述 在執行 ./hack/vpa-up.sh腳本命令時&#xff0c;提示有報錯。名為vpa-admission-controller的容器狀態一直停留在ContainerCreating&#xff0c;從該Pod詳細描述中得知&#xff0c;volume "tls-certs…

內核參數調優

默認的Linux內核參數考慮的是最通用場景&#xff0c;不符合用于支持高并發訪問的Web服務器的定義&#xff0c;根據業務特點來進行調整&#xff0c;當Nginx作為靜態web內容服務器、反向代理或者提供壓縮服務器的服務器時&#xff0c;內核參數的調整都是不同的&#xff0c;此處針…

【牛客】SQL131 作答試卷得分大于過80的人的用戶等級分布

描述 現有用戶信息表user_info&#xff08;uid用戶ID&#xff0c;nick_name昵稱, achievement成就值, level等級, job職業方向, register_time注冊時間&#xff09;&#xff1a; iduidnick_nameachievementleveljobregister_time11001牛客1號31007算法2020-01-01 10:00:00210…

常見外設學習以及無線通信頻率

常見外設 UART UART&#xff08;Universal Asynchronous Receiver/Transmitter&#xff0c;通用異步收發器&#xff09;是一種異步、串行、全雙工的通信總線。 UART 有3根線&#xff0c;分別是&#xff1a;發送線&#xff08;TX&#xff09;、接收線&#xff08;RX&#xff…

AT24C1024的模擬IIC驅動

AT24C1024是基于IIC的EEPROM&#xff0c;容量為1024/8128k bytes。它的引腳如下&#xff1a; 其中A1,A2為硬件地址引腳 WP為寫保護引腳&#xff0c;一般我們需要讀寫&#xff0c;需要接低電平GND&#xff0c;接高的話則僅允許讀 SDA和SCL則為IIC通信引腳 芯片通信采用IIC&…

02、MongoDB -- MongoDB 的安全配置(創建用戶、設置用戶權限、啟動安全控制、操作數據庫命令演示、mongodb 的幫助系統介紹)

目錄 MongoDB 的安全配置演示前準備&#xff1a;啟動 mongodb 服務器 和 客戶端 &#xff1a;1、啟動單機模式的 mongodb 服務器2、啟動 mongodb 的客戶端 MongoDB 的安全配置啟動演示用到的 mongodb 服務器 和 客戶端啟動單機模式的 mongodb 服務器&#xff1a;啟動 mongodb 的…

【數據結構】19 平衡二叉樹

定義 平衡二叉樹又稱為AVL樹&#xff0c;是具有以下性質的非空搜索樹&#xff1a; 任一結點的左、右子樹均為AVL樹。根節點的左、右子樹高度差的絕對值不超過1. 對于二叉樹的任一結點T&#xff0c;其平衡因子&#xff08;BF&#xff09;定義為BF(T) h L ? h R h_L- h_R hL…

acwing算法提高之搜索--雙向廣搜BFS與A星算法

目錄 1 專題說明2 訓練 1 專題說明 本專題用來記錄使用雙向廣搜BFS和A星算法求解的題目。 2 訓練 題目1&#xff1a;190字串變換 考點&#xff1a;從起點開始搜&#xff0c;從終點開始搜&#xff0c;即雙向廣搜。 C代碼如下&#xff0c; #include <iostream> #incl…

攻防世界-get_post

題目信息 相關知識 -G&#xff1a;表示GET請求&#xff0c;缺省POST -d參數用于發送 POST 請求的數據體 使用-d參數以后&#xff0c;HTTP 請求會自動加上標頭Content-Type : application/x-www-form-urlencoded。并且會自動將請求轉為 POST 方法&#xff0c;因此可以省略-X PO…

使用GPTQ進行4位LLM量化

使用GPTQ進行4位LLM量化 最佳腦量化GPTQ算法步驟1:任意順序洞察步驟2:延遲批量更新第三步:喬爾斯基重塑 用AutoGPTQ量化LLM結論References 權重量化的最新進展使我們能夠在消費級硬件上運行大量大型語言模型&#xff0c;例如在RTX 3090 GPU上運行LLaMA-30B模型。這要歸功于性能…

信息收集2.0版本

內網滲透之信息收集 whois查詢 1.1.1.1. 在線網站查詢 輸入相關的域名即可進行查詢。 &#xff08;1&#xff09;站長之家&#xff1a;whois域名查詢&#xff1a;http://whois.chinaz.com/ &#xff08;2&#xff09;愛站工具網&#xff1a;whois域名查詢&#xff1a;站長…

mysql數據庫操作小寄巧

目錄 json字段查詢時間相關只有日期只有時間又有時間又有日期時間比較時間運算 某字段同的取最新數據&#xff08;軟性的新數據覆蓋舊數據查找&#xff09;sql_modeonly_full_group_by的解決辦法優化思路 json字段查詢 查詢某個json字段&#xff08;xx&#xff09;的某個屬性下…

【考研數學】零基礎備考全年計劃

25考研數學基礎差&#xff0c;一定要重視基礎的復習&#xff01; 基礎不牢&#xff0c;地動山搖&#xff0c;這句話在如今的考研更加貼切 24考研的新形勢&#xff1a; 重基礎、計算量大、反押題 每一個變化對于基礎差的同學都不是好消息。 做過近幾年考研真題的人都會發現…

AI時代編程新寵!如何讓孩子成為未來的編程大師?

文章目錄 一、了解編程的基礎概念二、選擇適合的編程工具三、激發孩子的興趣四、注重基礎能力的培養五、提供實踐機會六、鼓勵孩子與他人合作七、持續支持與鼓勵《信息學奧賽一本通關》本書定位內容簡介作者簡介目錄 隨著科技的迅猛發展&#xff0c;編程已經從一種專業技能轉變…

Java實戰:PO、VO、DAO、BO、DTO與POJO在何處何場景下精準應用?

引言 在Java企業級應用開發中&#xff0c;良好的架構設計和清晰的數據模型劃分是保證代碼可讀性、可維護性和擴展性的基石。本文將深入剖析Java開發中常見的六大對象模型——PO&#xff08;Persistent Object&#xff09;、VO&#xff08;Value Object&#xff09;、DAO&#…