五種常用的web加密算法

文章目錄

  • 五種常用Web加密算法實戰及原理詳解
    • 1. AES (高級加密標準)
      • 原理詳解
      • 應用場景
      • 實戰代碼(Node.js)
    • 2. RSA (非對稱加密)
      • 原理詳解
      • 應用場景
      • 實戰代碼(Node.js)
    • 3. SHA-256 (安全哈希算法)
      • 原理詳解
      • 應用場景
      • 實戰代碼(瀏覽器環境)
    • 4. HMAC (基于哈希的消息認證碼)
      • 原理詳解
      • 應用場景
      • 實戰代碼(Node.js)
    • 5. PBKDF2 (基于密碼的密鑰派生函數)
      • 原理詳解
      • 應用場景
      • 實戰代碼(Node.js)
    • 加密算法對比表
    • 安全最佳實踐
    • 進階主題

在這里插入圖片描述

五種常用Web加密算法實戰及原理詳解

在現代Web開發中,數據安全至關重要。以下是五種最常用的Web加密算法,包括它們的原理、應用場景和實戰代碼示例。

1. AES (高級加密標準)

原理詳解

AES是一種對稱加密算法,使用相同的密鑰進行加密和解密。它采用替代-置換網絡(SPN)結構,主要步驟包括:

  1. 密鑰擴展:從初始密鑰派生多輪密鑰
  2. 初始輪:AddRoundKey(輪密鑰加)
  3. 主輪(重復9-13次):
    • SubBytes(字節替換)
    • ShiftRows(行移位)
    • MixColumns(列混淆)
    • AddRoundKey
  4. 最終輪(省略MixColumns)

AES有三種密鑰長度:128位、192位和256位,分別對應10、12和14輪加密。

應用場景

  • HTTPS傳輸中的數據加密
  • 數據庫敏感字段加密
  • 文件加密存儲

實戰代碼(Node.js)

const crypto = require('crypto');// AES-256-CBC加密
function encrypt(text, key, iv) {const cipher = crypto.createCipheriv('aes-256-cbc', Buffer.from(key), iv);let encrypted = cipher.update(text);encrypted = Buffer.concat([encrypted, cipher.final()]);return encrypted.toString('hex');
}// AES-256-CBC解密
function decrypt(encryptedText, key, iv) {const encryptedBuffer = Buffer.from(encryptedText, 'hex');const decipher = crypto.createDecipheriv('aes-256-cbc', Buffer.from(key), iv);let decrypted = decipher.update(encryptedBuffer);decrypted = Buffer.concat([decrypted, decipher.final()]);return decrypted.toString();
}// 使用示例
const key = crypto.randomBytes(32); // 256位密鑰
const iv = crypto.randomBytes(16);  // 初始向量
const message = 'Secret Message';const encrypted = encrypt(message, key, iv);
console.log('Encrypted:', encrypted);const decrypted = decrypt(encrypted, key, iv);
console.log('Decrypted:', decrypted);

2. RSA (非對稱加密)

在這里插入圖片描述

原理詳解

RSA基于大整數因數分解的困難性,主要步驟:

  1. 密鑰生成
    • 選擇兩個大素數p和q
    • 計算n = pq,φ(n) = (p-1)(q-1)
    • 選擇e使得1 < e < φ(n)且gcd(e, φ(n)) = 1
    • 計算d ≡ e?1 mod φ(n)
    • 公鑰=(e, n),私鑰=(d, n)
  2. 加密:c ≡ m? mod n
  3. 解密:m ≡ c? mod n

應用場景

  • SSL/TLS握手過程中的密鑰交換
  • 數字簽名
  • 小數據量加密(如加密對稱密鑰)

實戰代碼(Node.js)

const crypto = require('crypto');// 生成RSA密鑰對
const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', {modulusLength: 2048, // 密鑰長度publicKeyEncoding: {type: 'spki',format: 'pem'},privateKeyEncoding: {type: 'pkcs8',format: 'pem'}
});// RSA加密
function rsaEncrypt(data, publicKey) {return crypto.publicEncrypt({key: publicKey,padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,oaepHash: 'sha256'}, Buffer.from(data)).toString('base64');
}// RSA解密
function rsaDecrypt(encryptedData, privateKey) {return crypto.privateDecrypt({key: privateKey,padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,oaepHash: 'sha256'}, Buffer.from(encryptedData, 'base64')).toString();
}// 使用示例
const message = 'Confidential Data';const encrypted = rsaEncrypt(message, publicKey);
console.log('RSA Encrypted:', encrypted);const decrypted = rsaDecrypt(encrypted, privateKey);
console.log('RSA Decrypted:', decrypted);

3. SHA-256 (安全哈希算法)

在這里插入圖片描述

原理詳解

SHA-256是SHA-2家族的一員,產生256位哈希值。其工作流程:

  1. 預處理
    • 填充消息使其長度為512位的倍數
    • 附加原始消息長度
  2. 哈希計算
    • 將消息分成512位塊
    • 對每個塊應用64輪壓縮函數
    • 使用8個初始哈希值和64個預定義常數
    • 每輪包括消息調度、工作變量更新等操作
  3. 輸出:最終8個工作變量連接形成256位哈希

應用場景

  • 密碼存儲
  • 數據完整性驗證
  • 區塊鏈和加密貨幣
  • 數字簽名

實戰代碼(瀏覽器環境)

// 瀏覽器中使用Web Crypto API進行SHA-256哈希
async function sha256Hash(message) {// 將字符串編碼為Uint8Arrayconst encoder = new TextEncoder();const data = encoder.encode(message);// 計算哈希const hashBuffer = await crypto.subtle.digest('SHA-256', data);// 將ArrayBuffer轉換為十六進制字符串const hashArray = Array.from(new Uint8Array(hashBuffer));const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');return hashHex;
}// 使用示例
sha256Hash('Hello World').then(hash => console.log('SHA-256 Hash:', hash));

4. HMAC (基于哈希的消息認證碼)

在這里插入圖片描述

原理詳解

HMAC結合加密哈希函數和密鑰,提供消息認證。公式為:

HMAC(K, m) = H((K ⊕ opad) || H((K ⊕ ipad) || m))

其中:

  • H是哈希函數(如SHA-256)
  • K是密鑰
  • m是消息
  • opad是外部填充(0x5c重復)
  • ipad是內部填充(0x36重復)

應用場景

  • API請求認證
  • JWT簽名
  • 消息完整性驗證

實戰代碼(Node.js)

const crypto = require('crypto');// 生成HMAC
function generateHMAC(message, secret) {return crypto.createHmac('sha256', secret).update(message).digest('hex');
}// 驗證HMAC
function verifyHMAC(message, secret, hmac) {const expectedHmac = generateHMAC(message, secret);return crypto.timingSafeEqual(Buffer.from(expectedHmac),Buffer.from(hmac));
}// 使用示例
const secretKey = 'mySecretKey123';
const message = 'Important Data';const hmac = generateHMAC(message, secretKey);
console.log('HMAC:', hmac);const isValid = verifyHMAC(message, secretKey, hmac);
console.log('Verification:', isValid ? 'Valid' : 'Invalid');

5. PBKDF2 (基于密碼的密鑰派生函數)

在這里插入圖片描述

原理詳解

PBKDF2通過重復哈希增強弱密碼的安全性:

  1. 輸入密碼、鹽值、迭代次數和期望密鑰長度
  2. 對密碼和鹽值應用HMAC多次(迭代)
  3. 每次迭代的輸出與前一次結果異或
  4. 最終組合所有塊生成派生密鑰

應用場景

  • 用戶密碼存儲
  • 從密碼生成加密密鑰

實戰代碼(Node.js)

const crypto = require('crypto');// 使用PBKDF2派生密鑰
function deriveKey(password, salt, iterations, keyLength, digest) {return crypto.pbkdf2Sync(password,salt,iterations,keyLength,digest).toString('hex');
}// 使用示例
const password = 'userPassword123';
const salt = crypto.randomBytes(16).toString('hex'); // 生成隨機鹽
const iterations = 10000; // 迭代次數
const keyLength = 32; // 密鑰長度(字節)
const digest = 'sha256'; // 哈希算法const derivedKey = deriveKey(password, salt, iterations, keyLength, digest);
console.log('Derived Key:', derivedKey);
console.log('Salt:', salt);// 驗證密碼示例
function verifyPassword(password, storedHash, storedSalt, iterations, keyLength, digest) {const newHash = deriveKey(password, storedSalt, iterations, keyLength, digest);return newHash === storedHash;
}const isMatch = verifyPassword('userPassword123',derivedKey,salt,iterations,keyLength,digest
);
console.log('Password Match:', isMatch);

加密算法對比表

算法類型密鑰長度安全性性能適用場景
AES對稱加密128/192/256位大數據量加密
RSA非對稱加密2048位+密鑰交換、數字簽名
SHA-256哈希算法256位輸出數據完整性驗證
HMAC消息認證碼可變中等消息認證
PBKDF2密鑰派生可變可調密碼存儲

安全最佳實踐

  1. 密鑰管理

    • 永遠不要硬編碼密鑰
    • 使用密鑰管理系統(如AWS KMS、Hashicorp Vault)
    • 定期輪換密鑰
  2. 算法選擇

    • 對稱加密首選AES-256
    • 非對稱加密使用RSA 2048位或ECC 256位+
    • 哈希函數使用SHA-256或SHA-3
  3. 密碼存儲

    • 永遠不要明文存儲密碼
    • 使用PBKDF2、bcrypt或Argon2
    • 每個用戶使用唯一鹽值
  4. 傳輸安全

    • 始終使用HTTPS
    • 敏感數據在客戶端也應加密
  5. 錯誤處理

    • 加密失敗時不要暴露詳細信息
    • 使用恒定時間比較防止時序攻擊

進階主題

  1. 橢圓曲線加密(ECC):比RSA更高效的非對稱加密
  2. bcrypt/Argon2:更現代的密碼哈希算法
  3. 量子安全加密:抗量子計算的算法(如格密碼)
  4. 同態加密:在加密數據上直接計算
  5. 零知識證明:驗證信息而不泄露信息本身

通過掌握這五種核心加密算法及其實現,您已經具備了構建安全Web應用的基礎能力。在實際項目中,應根據具體需求選擇合適的算法組合,并遵循安全最佳實踐來保護用戶數據。

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

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

相關文章

深入解析 C++ 設計模式:原理、實現與應用

一、引言 在 C 編程的廣袤領域中&#xff0c;設計模式猶如閃耀的燈塔&#xff0c;為開發者指引著構建高效、可維護軟件系統的方向。設計模式并非神秘莫測的代碼魔法&#xff0c;實際上&#xff0c;我們在日常編程中或許早已與之打過交道。簡單來說&#xff0c;設計模式常常借助…

Python刷題筆記

Python刷題筆記 1、輸出格式化 第一種格式化的輸出&#xff1a; name "jack" age 17 salary 20031.8752 print("你的名字是&#xff1a;%s,今年 %d 歲,工資 %7.2f" % (name,age,salary) ) --------------------------------------- 你的名字是&#…

【Kubernetes】Kubernetes 如何進行日志管理?Fluentd / Loki / ELK 適用于什么場景?

由于 Kubernetes 運行在容器化的環境中&#xff0c;應用程序和系統日志通常分布在多個容器和節點上&#xff0c;傳統的日志管理方法&#xff08;例如直接訪問每個節點的日志文件&#xff09;在 Kubernetes 中不適用。 因此&#xff0c;Kubernetes 引入了集中式日志管理方案&am…

Ansible(8)——循環與條件任務

目錄 一、循環迭代任務&#xff1a; 1、簡單循環&#xff1a; 2、循環字典列表&#xff1a; 3、Ansible 2.5 之前的循環關鍵字&#xff1a; 4、在循環中使用 register 變量&#xff1a; 二、條件任務&#xff1a; 1、使用條件句的常見場景&#xff1a; 2、條件任務語法…

adb|scrcpy的安裝和配置方法|手機投屏電腦|手機聲音投電腦|adb連接模擬器或手機

adb|scrcpy的安裝和配置方法手機投屏電腦|手機聲音投電腦|adb連接模擬器或手機或電視 引言 在數字設備交織的現代生活中&#xff0c;adb&#xff08;Android Debug Bridge&#xff09;與 scrcpy 宛如隱匿的強大工具&#xff0c;極大地拓展了我們操控手機、模擬器乃至智能電視等…

vue3項目集成electron

一、環境準備 1. 確保已安裝 Node.js (建議版本 16.x 或更高) 2. 創建或進入現有 Vue 項目目錄 cd your-vue-project 二、添加 Electron 支持 在項目根目錄執行: vue add electron-builder 執行后會在 `src` 目錄下生成 `background.js` 主進程文件。 三、主進程配置 (ba…

循環神經網絡 - 參數學習之隨時間反向傳播算法

本文中&#xff0c;我們以同步的序列到序列模式為例來介紹循環神經網絡的參數學習。 循環神經網絡中存在一個遞歸調用的函數 &#x1d453;(?)&#xff0c;因此其計算參數梯度的方式和前饋神經網絡不太相同。在循環神經網絡中主要有兩種計算梯度的方式&#xff1a;隨時間反向…

體驗OceanBase的 并行導入功能

在數據庫的日常使用中&#xff0c;會經常遇到以下場景&#xff1a; ?數據復制?&#xff1a;將一個或多個表中的數據復制到目標表中&#xff0c;可能是復制全部數據&#xff0c;也可能僅復制部分數據。數據合并&#xff1a;將數據從一個表轉移到另一個表&#xff0c;或者將多…

Kafka和RocketMQ相比有什么區別?那個更好用?

Kafka和RocketMQ相比有什么區別?那個更好用? Kafka 和 RocketMQ 都是廣泛使用的消息隊列系統&#xff0c;它們有很多相似之處&#xff0c;但也有一些關鍵的區別。具體選擇哪個更好用&#xff0c;要根據你的應用場景和需求來決定。以下是它們之間的主要區別&#xff1a; 1. …

UniApp 實現兼容 H5 和小程序的拖拽排序組件

如何使用 UniApp 實現一個兼容 H5 和小程序的 九宮格拖拽排序組件&#xff0c;實現思路和關鍵步驟。 一、實現目標 支持拖動菜單項改變順序拖拽過程實時預覽移動位置拖拽松開后自動吸附回網格兼容 H5 和小程序平臺 二、功能結構拆解以及完整代碼 完整代碼&#xff1a; <…

[raspberrypi 0w and respeaker 2mic]實時音頻波形

0. 環境 ubuntu22主機&#xff0c; 192.168.8.162&#xff0c; raspberry 0w&#xff0c; 192.168.8.220 路由器 1. 樹莓派 # rpi - send.py # 或者命令行&#xff1a;arecord -D plughw:1,0 -t wav -f cd -r 16000 -c 2 | nc 192.168.8.162 12345import socket imp…

公司內部建立apt源

有一篇建立pypi源的在這里需要的可以查看&#xff1a;公司內部建立pypi源-CSDN博客 背景&#xff0c;公司內部有很多工具僅供內部使用&#xff0c;如果用apt的方式就比較方便&#xff0c;只需要修改sources.list將源添加進去就可以了。我們接下來的操作就是為了實現這個需求。…

UE5中如何修復后處理動畫藍圖帶來的自然狀態下的metablriger身體綁定形變(如聳肩)問題

【[metablriger] UE5中如何修復后處理動畫藍圖帶來的自然狀態下的metablriger身體綁定形變(如聳肩)問題】 UE5中如何修復后處理動畫藍圖帶來的自然狀態下的metablriger身體綁定形變(如聳肩)問題

AWS Bedrock生成視頻詳解:AI視頻創作新時代已來臨

?? TL;DR: AWS Bedrock現已支持AI視頻生成功能,讓企業無需深厚AI專業知識即可創建高質量視頻內容。本文詳解Bedrock視頻生成能力的工作原理、應用場景和實操指南,助你快速掌握這一革命性技術。 ?? AWS Bedrock視頻生成:改變內容創作的游戲規則 還記得幾年前,制作一個專…

1.2 測試設計階段:打造高質量的測試用例

測試設計階段&#xff1a;打造高質量的測試用例 摘要 本文詳細介紹了軟件測試流程中的測試設計階段&#xff0c;包括測試用例設計、測試數據準備、測試環境搭建和測試方案設計等內容。通過本文&#xff0c;讀者可以系統性地了解測試設計的方法和技巧&#xff0c;掌握如何高效…

jQueryHTML與插件

1.jQuery 事件機制 1.1 注冊事件 bind()、on()方法向被選元素添加一個或多個事件處理程序&#xff0c;以及當事件發生時運行的函數 $("p").on({"click": function () {alert("點擊了")},"mouseenter": function () {…

MySQL 觸發器與存儲過程:數據庫的自動化工廠

在數據世界的工業區&#xff0c;有一座運轉高效的自動化工廠&#xff0c;那里的機器人日夜不停地處理數據…這就是 MySQL 的觸發器與存儲過程系統&#xff0c;它讓數據庫從"手工作坊"變成了"現代化工廠"… 什么是 MySQL 觸發器與存儲過程&#xff1f;&…

PostgreSQL-中文字段排序-修改字段的排序規則

最新版本更新 https://code.jiangjiesheng.cn/article/365?fromcsdn 推薦 《高并發 & 微服務 & 性能調優實戰案例100講 源碼下載》 -- 修改字段的排序規則 ALTER TABLE "public"."your_table_name" ALTER COLUMN "name" TYPE varcha…

GitHub優秀項目:數據湖的管理系統LakeFS

lakeFS 是一個開源工具&#xff0c;它將用戶的對象存儲轉換為類似Git的存儲庫。使用戶可以像管理代碼一樣管理數據湖。借助 lakeFS&#xff0c;可以構建可重復、原子化和版本化的數據湖操作--從復雜的ETL作業到數據科學和分析。 Stars 數11090Forks 數3157 主要特點 強大的數據…

頁面編輯器CodeMirror初始化不顯示行號或文本內容

延遲刷新 本來想延遲100毫秒的&#xff0c;但是會出現樣式向左偏移的情況&#xff0c;于是試了試500毫秒&#xff0c;發現就沒有問題了&#xff0c;可能是樣式什么是需要一個加載過程吧。 useEffect(() > {editorRef.current?.setValue(value || );setTimeout(() > {edi…