本系列文章所討論的 JavaScript 資安與逆向工程技術,旨在分享知識、探討防禦之道,並促進技術交流。
所有內容僅供學術研究與學習,請勿用於任何非法或不道德的行為。
讀者應對自己的行為負完全責任。尊重法律與道德規範是所有技術人員應共同遵守的準則。
本文同步發佈:https://nicklabs.cc/algorithms-md5-sha-rsa
在進行 JavaScript 逆向工程時,我們常會看到資料不是直接明文傳輸,而是經過某種演算法處理。
這些處理方式不僅能混淆請求參數,也能增加逆向難度。
是一種雜湊算法且是單向且不可逆,它能將任意長度的輸入資料,轉換成一個固定長度的輸出。
檢查下載的檔案是否完整且未被修改。
過去伺服器不直接儲存使用者明文密碼,而是儲存其 MD5 雜湊值。(已不推薦使用)
從雜湊值無法逆向推導回原始輸入。
輸入不同,但輸出長度固定。
輸出的字串長度皆為32。
已被證明可被碰撞,也就是兩個不同的輸入產生相同的雜湊值,不建議用於安全驗證。
是一種雜湊算法且是單向且不可逆,SHA目前共有3種系列。
SHA-1: 發現可能遭受碰撞攻擊,目前也不建議使用。
SHA-2: 包含 SHA-224, SHA-256, SHA-384, 和 SHA-512 等,是目前最主流的 SHA 演算法系列。
SHA-3: 是一個新的雜湊演算法,目前也逐漸被採用。
檢查下載的檔案是否完整且未被修改。
也常用於API之中確保資料在傳輸過程中沒有被修改過。
從雜湊值無法逆向推導回原始輸入。
輸入不同,但輸出長度固定。
以SHA-256為例 輸出的字串長度皆為64。
雖然SHA-256難以被破解,但如果原文很簡單,還是可以被碰撞出來,因此每次雜湊必須加鹽來防禦此攻擊行為。
是可逆的加解密,並且基於數學上大數分解的困難性而設計。
常見的密鑰長度有 1024、2048、3072 與 4096 位元。
確保只有持有私鑰的人能解密,透過私鑰簽名、公鑰驗證,確保資料的真實性與完整性。
常與對稱加密演算法(如 AES)搭配,用於安全傳遞對稱金鑰。
需要一組「公鑰」與「私鑰」,公鑰用於加密,私鑰用於解密。
1024 位元已不再安全,必須使用 2048 位元以上。
客戶端隨機生成一組對稱金鑰(例如 256-bit AES key)。
客戶端使用伺服器的 RSA 公鑰,把這組 AES 金鑰加密。
把「RSA 加密後的 AES 金鑰」傳給伺服器。
再用這組 AES 金鑰加密大量資料(檔案、訊息、影像等)並傳送。
伺服器用自己的 RSA 私鑰解密取得拿回 AES 金鑰。
接著再用這個 AES 金鑰解密訊息內容。
RSA對於大資料效率不高,而 AES 在大資料加解密上極快。
AES 金鑰本身不會明文傳輸,而是經過 RSA 保護。