」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 跨平台使用 RSA 加密和解密保護數據

跨平台使用 RSA 加密和解密保護數據

發佈於2024-11-08
瀏覽:703

Securing Data with RSA Encryption and Decryption Across Platforms

RSA加密簡介

在當今的數位環境中,保護敏感資料對於個人和組織都至關重要。 RSA (Rivest-Shamir-Adleman) 加密作為保護資料的強大解決方案脫穎而出。它是一種非對稱加密演算法,這意味著它使用一對金鑰:用於加密的公鑰和用於解密的私鑰。 RSA 加密的主要好處之一是私鑰永遠不需要分享,這最大限度地降低了私鑰外洩的風險。

本文探討如何在三種流行的程式語言(JavaScript、Python 和 PHP)中使用 RSA 加密,從而更輕鬆地保護跨平台應用程式中的資料。

跨平台加密與解密:場景

假設您正在建立一個 Web 應用程序,其中敏感資訊(如身份驗證資料或個人詳細資料)必須在客戶端(前端)和伺服器(後端)之間安全傳輸。例如,您可以在客戶端使用 JavaScript 加密訊息,然後使用 Python 或 PHP 在伺服器上解密。

RSA 非常適合這種場景,因為它提供了一種語言加密和另一種語言解密的靈活性,確保了跨平台相容性。

RSA 實作:JavaScript、Python 和 PHP

JavaScript(附 JSEncrypt 的 Next.js)
加密:

import JSEncrypt from 'jsencrypt';

// Function to encrypt a message using a public key
const encryptWithPublicKey = (message) => {
  const encryptor = new JSEncrypt();
  const publicKey = process.env.NEXT_PUBLIC_PUBLIC_KEY.replace(/\\n/g, "\n");
  encryptor.setPublicKey(publicKey);
  const encryptedMessage = encryptor.encrypt(message);
  return encryptedMessage;
};

解密:

import JSEncrypt from 'jsencrypt';

// Function to decrypt a message using a private key
const decryptWithPrivateKey = (encryptedMessage) => {
  const decryptor = new JSEncrypt();
  const privateKey = process.env.PRIVATE_KEY.replace(/\\n/g, "\n");
  decryptor.setPrivateKey(privateKey);
  const decryptedMessage = decryptor.decrypt(encryptedMessage);
  return decryptedMessage;
};

解釋:

公鑰加密: JSEncrypt 函式庫使用公鑰加密訊息。這保證了只有對應的私鑰才能解密。
私鑰解密: 使用私鑰解密訊息,私鑰安全地儲存在環境變數中。
安全考量:透過使用RSA,我們確保客戶端發送的資料是加密且安全的。

Python(使用 rsa 函式庫)
加密:

import rsa
import base64

def encrypt_with_public_key(message: str, public_key_str: str) -> str:
    public_key = rsa.PublicKey.load_pkcs1_openssl_pem(public_key_str.encode())
    encrypted_message = rsa.encrypt(message.encode(), public_key)
    return base64.b64encode(encrypted_message).decode()

解密:

import rsa
import base64

def decrypt_with_private_key(encrypted_message: str, private_key_str: str) -> str:
    private_key = rsa.PrivateKey.load_pkcs1(private_key_str.encode())
    encrypted_bytes = base64.b64decode(encrypted_message.encode())
    decrypted_message = rsa.decrypt(encrypted_bytes, private_key)
    return decrypted_message.decode()

解釋:

公鑰加密: 使用公鑰對訊息進行加密,確保只有預期的私鑰持有者才能解密它。
Base64編碼:加密後,對訊息進行Base64編碼,以確保與文字傳輸的兼容性。
私鑰解密:私鑰用於解密Base64編碼的加密訊息,確保機密性。

PHP(使用 OpenSSL)
加密:

function encrypt_with_public_key($message) {
    $publicKey = getenv('PUBLIC_KEY');
    openssl_public_encrypt($message, $encrypted, $publicKey);
    return base64_encode($encrypted);
}

解密:

function decrypt_with_private_key($encryptedMessage) {
    $privateKey = getenv('PRIVATE_KEY');
    $encryptedData = base64_decode($encryptedMessage);
    openssl_private_decrypt($encryptedData, $decrypted, $privateKey);
    return $decrypted;
}

解釋:

公鑰加密: openssl_public_encrypt 函式使用公鑰對訊息進行加密,確保只有私鑰才能解密。
私鑰解密: openssl_private_decrypt 函式使用私鑰解密訊息,確保敏感資訊的安全。
環境變數:公鑰和私鑰都安全地儲存在環境變數中,增強安全性。

加密最佳實踐

使用環境變數:始終將密鑰儲存在環境變數中,而不是將它們硬編碼到應用程式中。這降低了暴露敏感資訊的風險。
加密敏感資料:加密個人和敏感數據,例如密碼、財務詳細資料或個人識別資訊 (PII),以防止未經授權的存取。
使用 HTTPS: 確保您的應用程式透過 HTTPS 進行通信,以保護傳輸中的資料。
安全金鑰管理:定期輪換加密金鑰並確保它們安全儲存。

為什麼選擇RSA加密?

增強資料安全性:RSA加密確保敏感資料在傳輸過程中保持安全,防止未經授權的存取。
非對稱加密: RSA 使用公鑰進行加密,使用私鑰進行解密,從而確保私鑰永遠不需要共用。
跨平台相容性: RSA 可以跨不同平台和程式語言無縫運作,使其成為客戶端和伺服器端使用不同技術的 Web 應用程式的理想選擇。

結論

RSA 加密提供了一種跨多個程式設計環境保護敏感資料的可靠方法。透過在 JavaScript、Python 和 PHP 中實現 RSA 加解密,您可以保護敏感資訊、增強安全性並確保跨平台相容性。無論是為了保護 API 呼叫、保護使用者資料或確保訊息的機密性,RSA 都提供了強大的加密解決方案。

如果您發現本指南有幫助,請考慮與其他開發人員分享,並繼續關注有關加密和資料安全的更多見解!

加密 #RSA #Cyber​​Security #DataSecurity #WebDevelopment #CrossPlatformSecurity #JavaScript #Python #PHP

版本聲明 本文轉載於:https://dev.to/shubhamkhan/securing-data-with-rsa-encryption-and-decryption-across-platforms-30d7?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 在PHP中如何高效檢測空數組?
    在PHP中如何高效檢測空數組?
    在PHP 中檢查一個空數組可以通過各種方法在PHP中確定一個空數組。如果需要驗證任何數組元素的存在,則PHP的鬆散鍵入允許對數組本身進行直接評估:一種更嚴格的方法涉及使用count()函數: if(count(count($ playerList)=== 0){ //列表為空。 } 對...
    程式設計 發佈於2025-04-26
  • 在Ubuntu/linux上安裝mysql-python時,如何修復\“ mysql_config \”錯誤?
    在Ubuntu/linux上安裝mysql-python時,如何修復\“ mysql_config \”錯誤?
    mysql-python安裝錯誤:“ mysql_config找不到”“ 由於缺少MySQL開發庫而出現此錯誤。解決此問題,建議在Ubuntu上使用該分發的存儲庫。使用以下命令安裝Python-MysqldB: sudo apt-get安裝python-mysqldb sudo pip in...
    程式設計 發佈於2025-04-26
  • 如何有效地轉換PHP中的時區?
    如何有效地轉換PHP中的時區?
    在PHP 利用dateTime對象和functions DateTime對象及其相應的功能別名為時區轉換提供方便的方法。例如: //定義用戶的時區 date_default_timezone_set('歐洲/倫敦'); //創建DateTime對象 $ dateTime = ne...
    程式設計 發佈於2025-04-26
  • 為什麼不````''{margin:0; }`始終刪除CSS中的最高邊距?
    為什麼不````''{margin:0; }`始終刪除CSS中的最高邊距?
    在CSS 問題:不正確的代碼: 全球範圍將所有餘量重置為零,如提供的代碼所建議的,可能會導致意外的副作用。解決特定的保證金問題是更建議的。 例如,在提供的示例中,將以下代碼添加到CSS中,將解決餘量問題: body H1 { 保證金頂:-40px; } 此方法更精確,避免了由全局保證金重置...
    程式設計 發佈於2025-04-26
  • 如何從PHP中的數組中提取隨機元素?
    如何從PHP中的數組中提取隨機元素?
    從陣列中的隨機選擇,可以輕鬆從數組中獲取隨機項目。考慮以下數組:; 從此數組中檢索一個隨機項目,利用array_rand( array_rand()函數從數組返回一個隨機鍵。通過將$項目數組索引使用此鍵,我們可以從數組中訪問一個隨機元素。這種方法為選擇隨機項目提供了一種直接且可靠的方法。
    程式設計 發佈於2025-04-26
  • 如何在鼠標單擊時編程選擇DIV中的所有文本?
    如何在鼠標單擊時編程選擇DIV中的所有文本?
    在鼠標上選擇div文本單擊帶有文本內容,用戶如何使用單個鼠標單擊單擊div中的整個文本?這允許用戶輕鬆拖放所選的文本或直接複製它。 在單個鼠標上單擊的div元素中選擇文本,您可以使用以下Javascript函數: function selecttext(canduterid){ if(d...
    程式設計 發佈於2025-04-26
  • C++20 Consteval函數中模板參數能否依賴於函數參數?
    C++20 Consteval函數中模板參數能否依賴於函數參數?
    [ consteval函數和模板參數依賴於函數參數在C 17中,模板參數不能依賴一個函數參數,因為編譯器仍然需要對非contexexpr futcoriations contim at contexpr function進行評估。 compile time。 C 20引入恆定函數,必須在編譯時進...
    程式設計 發佈於2025-04-26
  • 在JavaScript中如何獲取實際渲染的字體,當CSS字體屬性未定義時?
    在JavaScript中如何獲取實際渲染的字體,當CSS字體屬性未定義時?
    Accessing Actual Rendered Font when Undefined in CSSWhen accessing the font properties of an element, the JavaScript object.style.fontFamily and objec...
    程式設計 發佈於2025-04-26
  • 如何在Java字符串中有效替換多個子字符串?
    如何在Java字符串中有效替換多個子字符串?
    在java 中有效地替換多個substring,需要在需要替換一個字符串中的多個substring的情況下,很容易求助於重複應用字符串的刺激力量。 However, this can be inefficient for large strings or when working with nu...
    程式設計 發佈於2025-04-26
  • 為什麼我在Silverlight Linq查詢中獲得“無法找到查詢模式的實現”錯誤?
    為什麼我在Silverlight Linq查詢中獲得“無法找到查詢模式的實現”錯誤?
    查詢模式實現缺失:解決“無法找到”錯誤在Silverlight應用程序中,嘗試使用LINQ建立LINQ連接以錯誤而實現的數據庫”,無法找到查詢模式的實現。”當省略LINQ名稱空間或查詢類型缺少IEnumerable 實現時,通常會發生此錯誤。 解決問題來驗證該類型的質量是至關重要的。在此特定實例...
    程式設計 發佈於2025-04-26
  • 如何使用Python理解有效地創建字典?
    如何使用Python理解有效地創建字典?
    在python中,詞典綜合提供了一種生成新詞典的簡潔方法。儘管它們與列表綜合相似,但存在一些顯著差異。 與問題所暗示的不同,您無法為鑰匙創建字典理解。您必須明確指定鍵和值。 For example:d = {n: n**2 for n in range(5)}This creates a dict...
    程式設計 發佈於2025-04-26
  • 為什麼PYTZ最初顯示出意外的時區偏移?
    為什麼PYTZ最初顯示出意外的時區偏移?
    與pytz 最初從pytz獲得特定的偏移。例如,亞洲/hong_kong最初顯示一個七個小時37分鐘的偏移: 差異源利用本地化將時區分配給日期,使用了適當的時區名稱和偏移量。但是,直接使用DateTime構造器分配時區不允許進行正確的調整。 example pytz.timezone(&#...
    程式設計 發佈於2025-04-26
  • 如何限制動態大小的父元素中元素的滾動範圍?
    如何限制動態大小的父元素中元素的滾動範圍?
    在交互式接口中實現垂直滾動元素的CSS高度限制問題:考慮一個佈局,其中我們具有與用戶垂直滾動一起移動的可滾動地圖div,同時與固定的固定sidebar保持一致。但是,地圖的滾動無限期擴展,超過了視口的高度,阻止用戶訪問頁面頁腳。 $("#map").css({ margin...
    程式設計 發佈於2025-04-26
  • Python讀取CSV文件UnicodeDecodeError終極解決方法
    Python讀取CSV文件UnicodeDecodeError終極解決方法
    在試圖使用已內置的CSV模塊讀取Python中時,CSV文件中的Unicode Decode Decode Decode Decode decode Error讀取,您可能會遇到錯誤的錯誤:無法解碼字節 在位置2-3中:截斷\ uxxxxxxxx逃脫當CSV文件包含特殊字符或Unicode的路徑逃...
    程式設計 發佈於2025-04-26
  • Go語言垃圾回收如何處理切片內存?
    Go語言垃圾回收如何處理切片內存?
    Garbage Collection in Go Slices: A Detailed AnalysisIn Go, a slice is a dynamic array that references an underlying array.使用切片時,了解垃圾收集行為至關重要,以避免潛在的內存洩...
    程式設計 發佈於2025-04-26

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3