為了避免自己撰寫出具有安全風險的程式碼而仍不自知,就挑上這堂 從 OWASP Top 10 實現全方位防禦強化 課程。這邊筆記加解密字串的實作。
課程相關資訊
[連結]:https://hiskio.com/courses/1539/lectures/146932
本篇範圍:Chapter 9
請注意:本系列文章為個人對應課程的消化吸收後,所整理出來的內容。換言之,並不一定會包含全部的課程內容,也有可能會添加其他資源來說明。
內容
1. 明文加密時,都會需要一把 Key 作為金鑰。這把鑰匙需要是具有隨機性的字串,因此在產生這個字串時,會使用 Hash 方法。
2. 金鑰也可以使用 openSSL 所提供的 random_psuedo_bytes 方法生成
3. Libsodium 是內建於 php 7.1, 7.4 以後的開源、跨平台的函式庫
因此,於 JavaScript 上,也可使用 libsodium.js 套件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
import _sodium from 'libsodium-wrappers'; await (async() => { await _sodium.ready; const sodium = _sodium; // 生成加密金鑰 let key = sodium.crypto_secretstream_xchacha20poly1305_keygen(); // 初始化加密狀態 let res = sodium.crypto_secretstream_xchacha20poly1305_init_push(key); let [state_out, header] = [res.state, res.header]; // 加密消息 // TAG_MESSAGE 代表一般消息; TAG_FINAL 代表最後一個消息 let c1 = sodium.crypto_secretstream_xchacha20poly1305_push(state_out, sodium.from_string('message 1'), null, sodium.crypto_secretstream_xchacha20poly1305_TAG_MESSAGE); let c2 = sodium.crypto_secretstream_xchacha20poly1305_push(state_out, sodium.from_string('message 2'), null, sodium.crypto_secretstream_xchacha20poly1305_TAG_FINAL); // 初始化解密狀態,並使用先前生成的 header & key let state_in = sodium.crypto_secretstream_xchacha20poly1305_init_pull(header, key); // 解密消息 let r1 = sodium.crypto_secretstream_xchacha20poly1305_pull(state_in, c1); let [m1, tag1] = [sodium.to_string(r1.message), r1.tag]; let r2 = sodium.crypto_secretstream_xchacha20poly1305_pull(state_in, c2); let [m2, tag2] = [sodium.to_string(r2.message), r2.tag]; console.log(m1); console.log(m2); })(); |