# Revoice Taiwan (RVTW) 平台 網站實作與設計 資安細節 ## 前端 accessibilty accessibility API 無障礙設計 無障礙是盡可能令更多人,使用你網站的實做:一般來說,我們會認為這屬於身心障礙者的範疇,但它其實會涵蓋其他群體:像是使用行動設備、或者網速很慢的人。 也可以把無障礙想成:所有人,不論他們的能力或環境如何,都要同等看待、並給予同等機會。就如同我們不能把坐在輪椅的人,排除在某棟物理大樓之外:目前的公共建築,通常都會有電梯或輪椅坡道;我們也不能排除視障或手機用戶,使用我們的網站。儘管我們生而不同,但我們都是人,因此,我們都擁有相同的人權。 無障礙是好事,但也是某些國家法律的一部分,也能開啟一些關係到你的服務或產品的市場。 https://developer.mozilla.org/en-US/docs/Mozilla/Accessibility/Accessibility_API_cross-reference ## 授權個資的資料傳輸資安實作 從前端接受到的任何驗證資料(帳密,使用者驗證用隱私資料個人資料,token 等)都不直接儲存到 RVTW 平台系統,而是先經過雜湊函式處理成雜湊值,之後都只從雜湊值對應到的索引驗證資料。利用雜湊後的資料無法回推回明文資料跟當輸入的內容相同時會產生相同的雜湊資料,憑此驗證來源是合法的的兩大特性,確保資料沒有被竄改或偽造的可能性,以此驗證來自使用者的操作。也因為使用者只有傳送雜湊值給網站系統做索引使用,就連任何參與平台開發的工程人員都無法,存取任合平台使用者的個資 雜湊(英語:Hashing)是電腦科學中一種對資料的處理方法,通過某種特定的函式/演算法(稱為雜湊函式/演算法)將要檢索的項與用來檢索的索引(稱為雜湊,或者雜湊值)關聯起來,生成一種便於搜尋的資料結構(稱為雜湊表)。舊譯哈希(誤以為是人名而採用了音譯)。它也常用作一種資訊安全的實作方法,由一串資料中經過雜湊演算法(Hashing algorithms)計算出來的資料指紋(data fingerprint),經常用來識別檔案與資料是否有被竄改,以保證檔案與資料確實是由原創者所提供。 https://zh.wikipedia.org/zh-tw/%E5%93%88%E5%B8%8C%E8%A1%A8 --維基百科 ## HTTPS 以上重要資料和音檔資料與其他系統請求都會再透過帶有 TLS 加密的基於 http 通訊協定之上的通訊請求,也就是 https 協定傳輸,達到端對端加密傳輸的實作,來達到讓資料傳輸更安全與可靠,還能透過 ssl 授權證書來確保域名的正確授權,讓瀏覽器自動驗證 ssl 證書的可靠信的功能,保證使用者不被不安全的釣魚域名攻擊 ![](https://www.cloudflare.com/img/learning/cdn/tls-ssl/tls-ssl-handshake.png) ## 系統 API 邏輯實作框架設計 API 已經是全世界網站服務實作的重要基礎,能讓任何想要擴展一個網站服務的工程人員更自由方便的操作,甚至沒有技術基礎的人也能輕易方便的使用,也是實作一個支持網站服務資安 可靠性與維護性的重要基礎,目前大部分的網站服務都以 RESTful API 設計為主,你可以在 FAANG ( facebook apple amazon netflix google) 等各大公司看到他,也可以在任何日常使用的網站,看到這樣的實作規格,如今一個網站的 API 的支援已經是一個軟體服務成不成熟的關鍵指標。 那理所當然的就會碰到以下的 API 安全實作議題 API 授權與認證的維護,在 OWASP API Security Top 10 2019 就有三項最常見的漏洞形式,與此有關。 - Broken Object Level Authorization - Broken User Authentication - Broken Function Level Authorization 其他請見 OWASP API Security Project https://owasp.org/www-project-api-security/ 這就是發展 TDD (Test-driven development ) CI/CD (Continuous integration and continuous delivery )技術的一個重要場景,藉由測試開發為主的持續整合系統,才能做到持續驗證系統開發結果,在任何功能更新上線之前,就先件測出驗證與授權的弱點,還能持續檢測所有現有 API 的安全,並在檢測出任何破損的權限時,直接補丁上(patch),在最快時間,最小損害的範圍內,擋下資安風險。 不過我們知道 HTTPS Restful API 設計本身是無狀態的設計,所以我們一直必須透過其他實作去紀錄使用者的操作狀態,session token oauth JWT 都是為此而產生的技術產物,Revoice Taiwan 將會基於這些技術去開發授權認證相關功能。 session token oauth JWT https://medium.com/@sherryhsu/session-vs-token-based-authentication-11a6c5ac45e4 在確保使用者、物件與 API 的授權與認證安全後,還要確保使用者的寫入 input 操作不是要來滲透系統弱點(vulnerability) 的 payload 。 再更近一部解析之前,代碼注入 (Code Injection)是一個我們必須先了解的蓋念,代碼注入是一種因處理非法資料的電腦臭蟲應用。代碼注入可被攻擊者用來導入代碼到某特定的電腦程式,以改變程式的執行進程或目的。代碼注入攻擊的結果可以是災難性的。例如說:代碼注入可作為許多電腦蠕蟲繁殖的溫床。 其中網路服務以 SQL injection 的代碼注入攻擊及為最大宗最常見,曾出不窮,也是任何網路服務優先防範的對象。任何一個網站上有輸入資料能在後端接觸到資料庫的地方,都有遭受 SQL injection 攻擊的風險,只要一個簡單的填入表單資料的地方,即可執行,這使得任何一個服務使用者,都可以是潛在攻擊者,又因為是直接繞過原本資料庫邏輯的攻擊方式,很可能得到對資料庫直接的寫入能力,攻擊者對資料庫的破壞力是非常巨大的,有能利直接毀壞服務的整個資料庫。 不過以上系統服務基本上都可以用 javascript,php 或 python 為基礎的 web base 開發框架進行開發。 那我們就有了 orm 開發套件可以使用。 ORM (Object Relational Mapping 物件關聯對映)是在 (資料庫)和( Model 資料容器)兩者之間,把資料庫的操作與程式語言做物件關聯來操作簡單來說,它是一個幫助使用者更簡便、安全的去從資料庫讀取資料, 透過程式語言( javascript,php 或 python ),去操作資料庫語言( SQL )。這是實作了物件導向的概念,產生的一種工具模式,也早在各大程式語言與框架發展成熟,每個開發語言都有相對應的套件可以使用。 系統設計會以 web 框架裡的 ORM 去實作本來需要直接資料庫讀取的操作,避開直接操作資料庫的 CRUD 操作。讓 ORM 套件去避開 SQL injection 的危險 payload ,一定程度上攻擊者就少了很多可以注入攻擊的攻擊面。 不過有了新的技術基礎,舊有的過濾輸入還是少不了的。從特殊符號『'』、『;』、『--』、『=』、『''』、『or』,到 SQL (UPDATE DELETE 等)的操作語法,都不能放行到系統程序裡,在前面輸入之前就先過濾掉,透過 ORM 的實作方式,我們可以直接把過濾邏輯放入開發程式碼的操作裡,更直觀的維護。 更多 API 實作相關安全面請見 API Security: The Definitive Guide https://www.pingidentity.com/en/company/blog/posts/2020/everything-need-know-api-security-2020.html ## 後端資料庫 存回來的資料如何處理? 後端資料庫的加密不外乎兩個重點,一是確保你的加密演算法夠強,以及二是只有你服務的程式碼近程執行緒能讀取加密的密鑰,對資料庫進行操作。 經由前面哈希正確認證後的使用者才能跟系統服務的執行緒讀取需要的資料。 驗證過後再由系統產出的私鑰,每次存取使用者資料時,都先經過解密,才放行資料的操作。就算後端系統不幸遭到滲透,或是有內部開發者想惡意盜取資料,都還有加密過的資料庫的防護。而且前面對每筆資料的哈希能驗證,系統資料是否遭受惡意竄改或損壞,在出現資料損毀問題時替一時間從備份資料進行救援。 ## 以 IPFS 區塊鏈系統實作 上面我們以現代 web 技術實作了點對點的集中式系統,同樣的技術基礎 我們其實可以實作點對點的分散式系統, 為何需要分散式系統? 區塊鏈上的每個節點一同認證與運算帶來更強的安全性,因為每個節點可自由加入帶來的規模可變性與系統服務分散式帶來的穩定性。 區塊鏈(英語:blockchain)是藉由密碼學串接並保護內容的串連文字記錄(又稱區塊)。 每一個區塊包含了前一個區塊的加密雜湊、相應時間戳記以及交易資料(通常用默克爾樹(Merkle tree)演算法計算的雜湊值表示),這樣的設計使得區塊內容具有難以篡改的特性。用區塊鏈技術所串接的分散式帳本能讓兩方有效紀錄交易,且可永久查驗此交易。 區塊鏈最著名的實作,數位貨幣比特幣,雖然也能儲存資料,但是並不適合用在儲存資料容量較大的語音銀行系統上,因為在比特幣上的每個區塊僅能存 1MB 的資料,我們純存的的圖片、文件、檔案基本上起跳都大於 1MB ,故後來才會出現 以太坊(Ethereum),通過其專用加密貨幣以太幣(Ether,又稱「以太幣」)提供去中心化的虛擬機器(稱為「以太虛擬機」Ethereum Virtual Machine)來處理對等合約。 不再有 1MB 的限制了,只要將資料上傳即可,可是以金融合約運算為基準的系統儲存每筆資料都需要虛擬貨幣的費用,光是 4mb 的聲音檔案,就需要幾十顆以太幣的費用來做這項操作(目前相當於 8342 美金的費用)。 所以後來才會有由 Protocol Labs 主導開發的 IPFS ,全稱為 Interplanet File System,星際文件系統。IPFS 也是一種點對點的傳輸協議,每個節點都存儲一系列通過 hash 索引的文件。當某個客戶端需要訪問這些文件的時候,只需要通過一個巧妙封裝過的抽象層,傳入文件的 hash 值。 IPFS 會通過這個 hash 值,從活躍的節點當中找到對應的文件,並返回文件內容給客戶端。 IPFS (Interplanet File System,星際文件系統) https://ipfs.io/ 我們可以直接使用這個協定去實作前面的規格,只要知道文件的 hash 值,就能查看這份文件,可是如果我決定限制存取,任何一個操作使用就都需要使用者手上正確的密鑰才能解開並使用,所以就算資料是分散式的純存在全世界的每個節點上,卻只有擁有密鑰的本人可以使用該資料,也因為是分散式的純存軒因資料會被損毀,因為全世界的節點都有加密備份的該資料,還有每個節點都在互相驗證,保全資料的完整性與不可偽造,完全的隱私與資料安全都能被保障,而且任何開發者只要知道 IPFS 的標準後,就算不直接使用我們系統,也能透夠得到使用者授權後的資料,自由的開發第三方服務,而使用者與系統開法者的我們能決定這中間的所有授權費用。 ![](https://www.researchgate.net/profile/Nadeem_Javaid/publication/335652136/figure/fig1/AS:811949805821953@1570595327463/Data-sharing-on-IPFS-by-owner.png)