📜 [專欄新文章] [ZKP 讀書會] Trust Token Browser API
✍️ Yuren Ju
📥 歡迎投稿: https://medium.com/taipei-ethereum-meetup #徵技術分享文 #使用心得 #教學文 #medium
Trust Token API 是一個正在標準化的瀏覽器 API,主要的目的是在保護隱私的前提下提供跨站授權 (Cross-domain authorization) 的功能,以前如果需要跨站追蹤或授權通常都使用有隱私疑慮的 Cookies 機制,而 Trust Token 則是希望在保護隱私的前提下完成相同的功能。
會在 ZKP (Zero-knowledge proof) 讀書會研究 Trust Token 主要是這個 API 採用了零知識證明來保護隱私,這也是這次讀書會中少見跟區塊鏈無關的零知識證明應用。
問題
大家應該都有點了一個產品的網頁後,很快的就在 Facebook 或是 Google 上面看到相關的廣告。但是產品網頁並不是在 Facebook 上面,他怎麼會知道我看了這個產品的頁面?
通常這都是透過 Cookie 來做跨網站追蹤來記錄你在網路上的瀏覽行為。以 Facebook 為例。
當使用者登入 Facebook 之後,Facebook 會透過 Cookie 放一段識別碼在瀏覽器裡面,當使用者造訪了有安裝 Facebook SDK 來提供「讚」功能的網頁時,瀏覽器在載入 SDK 時會再度夾帶這個識別碼,此時 Facebook 就會知道你造訪了特定的網頁並且記錄下來了。如此一來再搭配其他不同管道的追蹤方式,Facebook 就可以建構出特定使用者在網路上瀏覽的軌跡,從你的瀏覽紀錄推敲喜好,餵給你 Facebook 最想給你看的廣告了。
不過跨站追蹤也不是只能用在廣告這樣的應用上,像是 CDN (Content Delivery Network) 也是一個應用場景。CDN 服務 Cloudflare 提供服務的同時會利用 Captcha 先來確定進入網站的是不是真人或是機器人。而他希望使用者如果是真人時下次造訪同時也是採用 Cloudflare 服務的網站不要再跳出 Captcha 驗證訊息。
雖然 Cloudflare 也需要跨站驗證的功能來完成他們的服務,但是相較於 Google 或 Facebook 來說他們是比較沒那麼想知道使用者的隱私。有沒有什麼辦法可以保護使用者隱私的狀況下還能完成跨站驗證呢?
這就是今天要講的新 API: Trust Token。
Trust Token API - The Chromium Projects
Trust Token / Privacy Pass 簡介
Trust Token 其實是由 Privacy Pass 延伸而來。Privacy Pass 就是由 Cloudflare 所開發的實驗性瀏覽器延伸套件實作一個驗證機制,可以在不透漏過多使用者隱私的前提下實作跨站驗證。而 Trust Token 則是標準化的 Privacy Pass,所以兩個運作機制類似,但是實作方式稍有不同。
先看一下 Privacy Pass 是如何使用。因為這是實驗性的瀏覽器延伸套件所以看起來有點陽春,不過大致上還是可以了解整個概念。
以 hCaptcha 跟 Cloudflare 的應用為例,使用者第一次進到由 Cloudflare 提供服務的網站時,網站會跳出一些人類才可以解答的問題比如說「挑出以下是汽車的圖片」。
當使用者答對問題後,Cloudflare 會回傳若干組 blind token,這些 blind token 還會需要經過 unblind 後才會變成真正可以使用的 token,這個過程為 issue token。如上圖所示假設使用者這次驗證拿到了 30 個 token,在每次造訪由 Cloudflare 服務的網站時就會用掉一個 token,這個步驟稱為 redeem token。
但這個機制最重要的地方在於 Cloudflare 並無法把 issue token 跟 redeem token 這兩個階段的使用者連結在一起,也就是說如果 Alice, Bob 跟 Chris 都曾經通過 Captcha 測試並且獲得了 Token,但是在後續瀏覽不同網站時把 token 兌換掉時,Clouldflare 並無法區分哪個 token 是來自 Bob,哪個 token 是來自 Alice,但是只要持有這種 token 就代表持有者已經通過了 Captcha 的挑戰證明為真人。
但這樣的機制要怎麼完成呢?以下我們會透過多個步驟的例子來解釋如何達成這個目的。不過在那之前我們要先講一下 Privacy Pass 所用到的零知識證明。
零知識證明 (Zero-knowledge proof)
零知識證明是一種方法在不揭露某個祕密的狀態下,證明他自己知道那個秘密。
Rahil Arora 在 stackexchange 上寫的比喻我覺得是相對好理解的,下面簡單的翻譯一下:
假設 Alice 有超能力可以幾秒內算出樹木上面有幾片樹葉,如何在不告訴 Bob 超能力是怎麼運作並且也不告訴 Bob 有多少片葉子的狀況下證明 Alice 有超能力?我們可以設計一個流程來證明這件事情。
Alice 先把眼睛閉起來,請 Bob 選擇拿掉樹上的一片葉子或不拿掉。當 Alice 睜開眼睛的時候,告訴 Bob 他有沒有拿掉葉子。如果一次正確的話確實有可能是 Alice 幸運猜到,但是如果這個過程連續很多次時 Alice 真的擁有數葉子的超能力的機率就愈來愈高。
而零知識證明的原理大致上就是這樣,你可以用一個流程來證明你知道某個秘密,即使你不真的揭露這個秘密到底是什麼,以上面的例子來說,這個秘密就是超能力運作的方式。
以上就是零知識證明的概念,不過要完成零知識證明有很多各式各樣的方式,今天我們要介紹的是 Trust Token 所使用的零知識證明:DLEQ。
DLEQ (Discrete Logarithm Equivalence Proof)
說明一下以下如果小寫的變數如 c, s 都是純量 (Scalar),如果是大寫如 G, H則是橢圓曲線上面的點 (Point),如果是 vG 則一樣是點,計算方式則是 G 連續相加 v 次,這跟一般的乘法不同,有興趣可以程式前沿的《橢圓曲線加密演算法》一文解釋得比較詳細。
DLEQ 有一個前提,在系統中的所有人都知道公開的 G 跟 H 兩個點,此時以下等式會成立:
假設 Peggy 擁有一個秘密 s 要向 Victor 證明他知道 s 為何,並且在這個過程中不揭露 s 真正的數值,此時 Victor 可以產生一個隨機數 c 傳送給 Peggy,而 Peggy 則會再產生一個隨機數 v 並且產生 r,並且附上 vG, vH, sG, sH:
r = v - cs
所以 Victor 會得到 r, sG, sH, vG, vH 再加上他已經知道的 G, H。這個時候如果 Victor 計算出以下兩個等式就代表 Peggy 知道 s 的真正數值:
vG = rG + c(sG)vH = rH + c(sH)
我們舉第二個等式作為例子化簡:
vH = rH + c(sH) // 把 r 展開成 v - csvH = (v - cs)H + c(sH) // (v - cs)H 展開成 vH - csHvH = vH - c(sH) + c(sH) // 正負 c(sH) 消掉vH = vH
這樣只有 Peggy 知道 s 的狀況下才能給出 r,所以這樣就可以證明 Peggy 確實知道 s。
從簡易到實際的情境
Privacy Pass 網站上透過了循序漸進的七種情境從最簡單的假設到最後面實際使用的情境來講解整個機制是怎麼運作的。本文也用相同的方式來解釋各種情境,不過前面的例子就會相對比較天真一點,就請大家一步步的往下看。
基本上整個過程是透過一種叫做 Blind Signature 的方式搭配上零知識證明完成的,以下參與的角色分為 Client 與 Server,並且都會有兩個階段 issue 與 redeem token。
Scenario 1
如果我們要設計一個這樣可以兌換 token 來確認身分的系統,其中有一個方法是透過橢圓曲線 (elliptic curve) 完成。Client 挑選一個在橢圓曲線上的點 T 並且傳送給 Server,Server 收到後透過一個只有 Server 知道的純量 (scalar) s 對 T 運算後得到 sT 並且回傳給 Client,這個產生 sT 的過程稱為 Sign Point,不過實際上運作的原理就是橢圓曲線上的連續加法運算。
SignPoint(T, s) => sT
等到 Client 需要兌換時只要把 T 跟 sT 給 Server,Server 可以收到 T 的時候再 Sign Point 一次看看是不是 sT 就知道是否曾經 issue 過這個 token。
Issue
以下的範例,左邊都是 Client, 右邊都是 Server。 -> 代表 Client 發送給 Server,反之亦然。
// Client 發送 T 給 Server, 然後得到 sT
T -> <- sT
Redeem
// Client 要 redeem token 時,傳出 T 與 sT
T, sT ->
問題:Linkability
因為 Server 在 issue 的時候已經知道了 T,所以基本上 Server 可以透過這項資訊可以把 issue 階段跟 redeem 階段的人連結起來進而知道 Client 的行為。
Scenario 2
要解決上面的問題,其中一個方法是透過 Blind Signature 達成。Client 不送出 T,而是先透過 BlindPoint 的方式產生 bT 跟 b,接下來再送給 Server bT。Server 收到 bT 之後,同樣的透過 Sign Point 的方式產生結果,不一樣的地方是情境 1 是用 T,而這邊則用 bT 來作 Sign Point,所以得出來的結果是 s(bT)。
Client:BlindPoint(T) => (bT, b)
Server:SignPoint(bT, s) => sbT
而 Blind Signature 跟 Sign Point 具備了交換律的特性,所以得到 s(bT) 後可以透過原本 Client 已知的 b 進行 Unblind:
UnblindPoint(sbT, b) => sT
這樣一來在 Redeem 的時候就可以送出 T, sT 給 Server 了,而且透過 SignPoint(T, s) 得出結果 sT’ 如果符合 Client 傳來的 sT 就代表確實 Server 曾經簽過這個被 blind 的點,同時因為 T 從來都沒有送到 Server 過,所以 Server 也無法將 issue 與 redeem 階段的 Client 連結在一起。
Issue
bT -> <- s(bT)
Redeem
T, sT ->
問題:Malleability
以上的流程其實也有另外一個大問題,因為有交換律的關係,當 Client 透過一個任意值 a 放入 BlindPoint 時產生的 a(sT) 就會等於 s(aT):
BlindPoint(sT) => a(sT), a// a(sT) === s(aT)
此時如果將 aT 跟 s(aT) 送給 Server Redeem,此時因為
SignPoint(aT, s) => s(aT)
所以就可以兌換了,這樣造成 Client 可以無限地用任意數值兌換 token。
Scenario 3
這次我們讓 Client 先選擇一個純數 t,並且透過一種單向的 hash 方式來產生一個在橢圓曲線上的點 T,並且在 redeem 階段時原本是送出 T, sT 改成送出 t, sT。
因為 redeem 要送出的是 t,上個情境時透過任意數 a 來產生 s(aT) 的方法就沒辦法用了,因為 t 跟 sT 兩個參數之間並不是單純的再透過一次 BlindPoint() 就可以得到,所以就沒辦法無限兌換了。
Issue
T = Hash(t) bT -> <- sbT
Redeem
t, sT ->
問題:Redemption hijacking
在這個例子裏面,Client 其實是沒有必要傳送 sT 的,因為 Server 僅需要 t 就可以計算出 sT,額外傳送 sT 可能會導致潛在的 Redemption hijacking 問題,如果在不安全的通道上傳輸 t, sT 就有可能這個 redemption 被劫持作為其他的用途。
不過在網站上沒講出實際上要怎麼利用這個問題,但是少傳一個可以計算出來的資料總是好的。Client 只要證明他知道 sT 就好,而這可以透過 HMAC (Hash-based Message Authentication Code) 達成。
Scenario 4
步驟跟前面都一樣,唯一不一樣的地方是 redeem 的時候原本是傳 t, sT,現在則改傳 t, M, HMAC(sT, M),如果再介紹 HMAC 篇幅會太大,這邊就不解釋了,但可以是作是一個標準的 salt 方式讓 Hash 出來的結果不容易受到暴力破解。
這樣的特性在這個情境用很適合,因為 Server 透過 t 就可以計算出 sT,透過公開傳遞的 M 可以輕易地驗證 client 端是否持有 sT。
Issue
T = Hash(t) bT -> <- sbT
Redeem
t, M, HMAC(sT, M) ->
問題:Tagging
這邊的問題在於 Server 可以在 issue 階段的時候用不一樣的 s1, s2, s3 等來發出不一樣的 sT’,這樣 Server 在 Redeem 階段就可以得知 client 是哪一個 s。所以 Server 需要證明自己每次都用同樣的 s 同時又不透漏 s 這個純亮。
要解決這個問題就需要用到前面我們講解的零知識證明 DLEQ 了。
Scenario 5
前面的 DLEQ 講解有提到,如果有 Peggy 有一個 s 秘密純量,我們可以透過 DLEQ 來證明 Peggy 知道 s,但是又不透漏 s 真正的數值,而在 Privacy Pass 的機制裡面,Server 需要證明自己每次都用 s,但是卻又不用揭露真正的數值。
在 Issue 階段 Client 做的事情還是一樣傳 bT 給 Server 端,但 Server 端的回應就不一樣了,這次 Server 會回傳 sbT 與一個 DLEQ 證明,證明自己正在用同一個 s。
首先根據 DLEQ 的假設,Server 會需要先公開一組 G, H 給所有的 Client。而在 Privacy Pass 的實作中則是公開了 G 給所有 Client,而 H 則改用 bT 代替。
回傳的時候 Server 要證明自己仍然使用同一個 s 發出 token,所以附上了一個 DLEQ 的證明 r = v - cs,Client 只要算出以下算式相等就可證明 Server 仍然用同一個 s (記住了 H 已經改用 bT 代替,此時 client 也有 sbT 也就是 sH):
vH = rH + c(sH) // H 換成 bTvbT = rbT + c(sbT) // 把 r 展開成 v - csvbT = (v - cs)bT + c(sbT) // (v - cs)bT 展開成 vbT - csbTvbT = vbT - c(sbT) + c(sbT) // 正負 c(sbT) 消掉vbT = vbT
這樣就可以證明 Server 依然用同一個 s。
Issue
T = Hash(t) bT -> <- sbT, DLEQ(bT:sbT == G:sG)
Redeem
t, M, HMAC(sT, M) ->
問題:only one redemption per issuance
到這邊基本上 Privacy Pass 的原理已經解釋得差不多了,不過這邊有個問題是一次只發一個 token 太少,應該要一次可以發多個 token。這邊我要跳過源文中提到的 Scenario 6 解釋最後的結果。
Scenario 7
由於一次僅產生一個 redeem token 太沒效率了,如果同時發很多次,每次都產生一個 proof 也不是非常有效率,而 DLEQ 有一個延伸的用法 “batch” 可以一次產生多個 token, 並且只有使用一個 Proof 就可以驗證所有 token 是否合法,這樣就可以大大的降低頻寬需求。
不過這邊我們就不贅述 Batch DLEQ 的原理了,文末我會提及一些比較有用的連結跟確切的源碼片段讓有興趣的人可以更快速的追蹤到源碼片段。
Issue
T1 = Hash(t1) T2 = Hash(t2)T3 = Hash(t3)b1T1 ->b2T2 ->b3T3 -> c1,c2,c3 = H(G,sG,b1T1,b2T2,b3T3,s(b1T1),s(b2T2),s(b3T3)) <- sb1T1 <- sb2T2 <- sb3T3 <- DLEQ(c1b1T1+c2b2T2+c3b3T3:s(c1b1T1+c2b2T2+c3b3T3) == G: sG)
Redeem
t1, M, HMAC(sT1, M) ->
結論
Privacy Token / Trust Token API 透過零知識證明的方式來建立了一個不需要透漏太多隱私也可以達成跟 cookie 相同效果的驗證方式,期待可以改變目前許多廣告巨頭透過 cookie 過分的追蹤使用者隱私的作法。
不過我在 Trust Token API Explainer 裡面看到這個協議裡面的延伸作法還可以夾帶 Metadata 進去,而協議制定的過程中其實廣告龍頭 Google 也參與其中,希望這份協議還是可以保持中立,盡可能地讓最後版本可以有效的在保護隱私的情況下完成 Cross-domain authorization 的功能。
參考資料
IETF Privacy Pass docs
Privacy Pass: The Protocol
Privacy Pass: Architectural Framework
Privacy Pass: HTTP API
Cloudflare
Supporting the latest version of the Privacy Pass Protocol (cloudflare.com)
Chinese: Cloudflare支持最新的Privacy Pass扩展_推动协议标准化
Other
Privacy Pass official website
Getting started with Trust Tokens (web.dev)
WICG Trust Token API Explainer
Non-interactive zero-knowledge (NIZK) proofs for the equality (EQ) of discrete logarithms (DL) (asecuritysite.com) 這個網站非常實用,列了很多零知識證明的源碼參考,但可惜的是 DLEQ 這個演算法講解有錯,讓我在理解演算法的時候撞牆很久。所以使用的時候請多加小心,源碼應該是可以參考的,解釋的話需要斟酌一下。
關鍵源碼
這邊我貼幾段覺得很有用的源碼。
privacy pass 提供的伺服器端產生 Proof 的源碼
privacy pass 提供的瀏覽器端產生 BlindPoint 的源碼
github dedis/kyber 產生 Proof 的源碼
[ZKP 讀書會] Trust Token Browser API was originally published in Taipei Ethereum Meetup on Medium, where people are continuing the conversation by highlighting and responding to this story.
👏 歡迎轉載分享鼓掌
同時也有2部Youtube影片,追蹤數超過91萬的網紅笑波子,也在其Youtube影片中提到,我要做「大皇帝」? 三國迷必玩! ;) 20號新SERVER 57S開左再講我叫咩名, 因為多數笑波子ID會被用... orz 新服送張飛+10萬糧CODE: DHDS57 (26號前用) PLAY LINK: http://vda.icantw.com/?q=160517yCIAqaK ...
「code server教學」的推薦目錄:
- 關於code server教學 在 Taipei Ethereum Meetup Facebook 的最讚貼文
- 關於code server教學 在 Taipei Ethereum Meetup Facebook 的最讚貼文
- 關於code server教學 在 小吃貨的英國生活日記 Facebook 的最讚貼文
- 關於code server教學 在 笑波子 Youtube 的最佳貼文
- 關於code server教學 在 笑波子 Youtube 的最佳貼文
- 關於code server教學 在 Visual Studio Code 外掛自助餐|#2 LiveServer 深度探索 的評價
- 關於code server教學 在 #分享使用VS Code 遠端開發 - 軟體工程師板 | Dcard 的評價
- 關於code server教學 在 使用VSCode Remote透過SSH 進行遠端開發 - gists · GitHub 的評價
- 關於code server教學 在 12 個前端愛用的VSCode 擴充套件 的評價
- 關於code server教學 在 網頁開發雜記- Visual Studio Code 教學... 的評價
code server教學 在 Taipei Ethereum Meetup Facebook 的最讚貼文
📜 [專欄新文章] Private key security and protection / 私錀的安全與保護 — Tim Hsu
✍️ 洪偉捷
📥 歡迎投稿: https://medium.com/taipei-ethereum-meetup #徵技術分享文 #使用心得 #教學文 #medium
Private key security and protection / 私錀的安全與保護 — Tim Hsu
Crosslink Taipei 在10/19、10/20 台北矽谷會議中心舉辦的 區塊鏈conf。 這是Crosslink Taipei 下午的演講,主講者是擔任CYBAVO CTO的徐千洋(Tim Hsu)先生,同時也是幣托、OTCBTC的資安顧問。
2018年一月被發現的硬體漏洞meldown跟spectr,我們的硬體為了要讓執行速度更快,processor會預先執行某些指令,也因此駭客可以透過這種方式,間接檢測出我們記憶體的內容,把敏感資訊都dump出來。雖然後這之後各CPU廠商都有推出針對這個bug的軟體update,但是在這之後硬體安全的問題逐漸浮出來面,也使世人意識到硬體資安的問題。而今天我們要談的部分不僅有軟體安全,也有硬體安全跟使用者資安觀念的問題。
淺談交易所與錢包
在從交易所提幣的時候,首先Server會先將這筆交易紀錄到交易所自己的資料庫內,之後再取得交易所金庫的private key去金庫取錢,再打到使用者的錢包內。在這個過程中,如果駭客可以竄改Server或資料庫的交易金額,原本要打給使用者1 BTC,變成10BTC,或是直接取得金庫的private key,對交易所都是一大噩夢
圖(一) 從交易所提幣的流程
攻擊手法
1. 交易所的網路架構
案例一: 交易所因為怕被偷交易資料與客戶資料,所以都把這些資訊先加密後再存到資料庫,但是這些資料仍然會被偷(交易所遭到電話詐騙),往後將這些資料加了三層密,仍無法防範資料被偷的情形,原因出在圖(二)的交易所網路架構。
圖(二) 交易所的網路架構(OA與資料庫間沒防火牆)
因為OA 與資料庫之間的網路沒有防火牆保護,所以駭客不用正面攻擊有防火牆的部分,而是攻擊OA的部分,再藉由OA連線到資料庫。一封藏有病毒的email求職信寄到HR的電腦,都有可能造成交易所資料外流。
解決方式: 就是在OA與資料庫間架個防火牆,如圖(三)所示。例如: 只有Engineer、RD 可以連線到資料庫,QA則只能連到測試環境,HR、CEO不需要、也不能連線到資料庫,依職責對連線範圍做縮限,則駭客可以攻擊的目標變少,我們也比較好做應對。講者重要的一句話: 「千萬不要輕忽駭客攻擊OA的能力」
圖(三) 好的交易所的網路架構
2. DNS Attack
透過汙染AWS 的DNS Server 將交易所網頁導向駭客的網頁,來騙取使用者個資。雖然在導向駭客頁面時,很容易發現駭客的網頁沒有使用安全憑證,或是安全憑證不是SSL核發,但使用者仍可能因資安觀念低落,而堅持連線到不安全的網站。
3. Online Paper Wallet
很多人因為覺得私鑰放電腦覺得不安全,又沒錢買硬體錢包,所以透過線上私鑰轉換器將私鑰轉換成QR code,然而再轉換時勢必要輸入自己的私鑰,容易使私鑰遭竊。
圖(四) 私鑰轉換詐騙網頁
4. 使用者對私鑰保護的意識很低
例如: 不了解私鑰的註記詞或其他相關資訊保密的重要性,而無意間通過社交軟體洩漏了這些重要資訊(硬體錢包開箱文 XD)。
5. 硬體錢包的漏洞
TREZOR 錢包是業內公認的研發最早最警慎最安全的加密儲存器,但是今年仍被發現硬體相關的漏洞。只要駭客輸入特定24碼pin碼,就可以通過硬體的側通道分析,輕易提取出未加密的私鑰,而且這個必須重新設計硬體架構才能夠防止這樣的攻擊。所以即便硬體錢包掉了,仍有被攻擊的疑慮,最好的解決辦法就是硬體錢包外再設定一個long Password,這樣就可以避免掉硬體錢包時帳戶虛擬貨幣遭竊
圖(五) 硬體錢包漏洞
題外話 — Iphone Jailbreak問題
今年在twitter,有人公布了最新攻擊iphone的方式,而問題出在手機晶片。Iphone開機時第一個執行的程序是 bootrom,而bootrom的程式碼則是位於記憶體唯獨區域,所以無法竄改。駭客可以利用bootrom上的bug來攻擊手機,而這些有問題的晶片出現在Iphone 6 ~ Iphone X。其實這攻擊方式充滿限制,不僅要取得欲攻擊的手機,而且這種攻擊方式每次重開機就會刷新。不過這也衍伸出新的問題,以後的iOS作業系統都更容易遭到入侵,因為我們可以在舊的手機上裝新的iOS系統,然後透過bootrom的漏洞來了解新的iOS系統的運作方式,因此這個問題應該被更加重視。
圖(六) axi0mX針對此bug的文章
保護方式
透過secure sharing將私鑰拆成User、Company、Vendor,分散私鑰存放風險
圖(七) 拆散私鑰,分散存放的風險
保護思維
未來除了在演算法的鑽研,也應該多多關注整個 區塊鏈產業的資安問題,從身分認證、系統安全、IT架構,都應該要從安全的角度來設計。
圖(八) 講者參考的設計架構
以上方的圖片為例,很多軟體架構在設計時都忽略了作業系統這一塊,而講者分享了他在設計時針對Server或資料庫的 OS做的處理,如下圖
圖(九) OS層級的安全防護
我們的app、網站、服務都跑在Sandbox層上,Sandbox可以限制由內到外的網路封包收送,同時在Sandbox之上還有Host-IDS(Host-based Intruction Detection System)會記錄及過濾程式在Sandbox跑的所有指令,而且有任何非法存取記憶體或網路封包的行為都會都過Host-IDS被記錄到Threat Intelligence,並且通知使用者。 我覺得這樣的好處是,使用者不僅可以在第一時間知道自己的帳號遭到駭客攻擊,也因為一切的動作都被Host-IDS過濾以及被記錄到Threat Intelligence,工程師也可以更快找到安全漏洞。
結語
近年來因網路的應用,資安越來越重要,除了軟體方面外,硬體方面也要兼顧安全,而使用者的觀念宣導更重要,否則不管我們的系統做的再怎麼嚴密,只要使用者意外連到駭客網站或是洩漏自己的私鑰,一切都是白談。演講中有一句話我覺得很值得借鏡,就是「我們一定要假設我們的系統會被駭客破解,而我們要做的就是盡可能減少被入侵後的損失」,上面提到的Host-IDS就是這樣的觀念,我們無法防止駭客進到Sandbox,但是可以記錄駭客的進到Sandbox後所有行為,這樣的架構才能在第一時間修正系統漏洞。
參考資料
Trezor錢包漏洞: https://bcsec.org/index/detail/id/585/tag/2
Iphone 漏洞: https://www.pcmarket.com.hk/2019/09/30/iphone-bootrom%E8%B6%8A%E7%8D%84%E5%B7%A5%E5%85%B7%E5%85%AC%E9%96%8B-4s%E8%87%B3x%E5%85%A8%E9%81%AD%E6%AE%83%E5%B9%B8%E5%8D%B1%E9%9A%AA%E6%80%A7%E4%BD%8E/
spectre&meldown介紹: https://www.youtube.com/watch?v=bs0xswK0eZk
Private key security and protection / 私錀的安全與保護 — Tim Hsu was originally published in Taipei Ethereum Meetup on Medium, where people are continuing the conversation by highlighting and responding to this story.
👏 歡迎轉載分享鼓掌
code server教學 在 小吃貨的英國生活日記 Facebook 的最讚貼文
#關於成為工程師這件事 #文長慎入
如果有follow 我之前寫的種種文章,大概就知道我的一些經歷。但這邊還是來快速回顧一下。
大學的時候唸了歷史系,雖說跟分數也有關係,但一部分也是因為我對歷史很有興趣,小時候當所有人都想當老師,或醫生護士這種職業的時候,我總是想說要當那種什麼考古學家~探險家之類的,當然歷史學家跟發明家也是在考量的項目中,長大以後才發現,這好像有點不是現實中可以很容易實現的職業。
很多科目,像是歷史,或者其他社會科學相關的,在台灣畢業以後都非常難找工作,即使你認真向學,決定一路念到博士,也不見得畢業後可以找到教職或博後。即使是商學院畢業出來,在台灣可以做的也很有限,尤其當你是什麼管理學院相關的出來,也不太有機會直接躍升管理職。
台灣的產業其實比很多國家來的少,可以做的工作也有限,大部分都是科技相關,這也造就了台灣過去二三十年的榮光,到現在也一直是科技業為主流。當然科技業變成世界主流已經不是這一兩年的事情,全世界越來越多人想要擠進科技業,因為科技進步導致很多傳統產業面臨倒閉或者被迫改變。
說起來一開始除了自己想要試試看自己到底學不學得會寫程式這件情,再來就是因為不想一輩子領著低薪過著普通OL的日子,加上一直對國外有的憧憬,很想去國外看看外面的世界,體驗國外的生活,尤其是對歐美國家有著美好的想像。
要說當時為什麼做了這種倉促決定,其實大概就只是一個不甘心吧!因為在台灣沒有辦法念研究所,被各大學拒絕以後,就心想乾脆嘗試國外的大學,看有沒有人要我。其實大概就是個背水一戰的概念。
一直以來我都有點,盲目的亂衝。就是想到什麼就決定做什麼,當然有時候我也會變得很膽小,就會想太多,然後不敢前進。可是時常又覺得,應該要強迫自己前進,因為知道自己是個懶惰的人,所以不想辦法把自己帶到那個不得不的情況,自己就會一直怠惰下去。
說起來,一開始我也不是很認真的想要當工程師,也就是半推半就,覺得試試看的心態,身邊也沒有什麼人把這件事情當一回事,這都是到英國念研究所以後,才開始覺得自己可以做些什麼事情。但最近我也在反省,覺得自已以前在研究所也是很混,覺得自己第一年工作真的完全不知道在幹嘛。
最近到了新公司工作以後,發現公司很多人都是轉職的人,有人在媒體業待了十年,有人在金融業,有人從醫療產業,有人從產品經理轉職,大家都非常的認真,比我還要認真許多。
雖然我一直覺得,自己跟其他本科系畢業的人比起來,年紀很大,甚至會覺得自己轉行轉得太晚,有時候也會想說,為什麼自己國高中的時候不自己上網學寫程式,為什麼不好好念數學,這樣可以考個工程相關的科系。
可是在新公司遇到了很多他們以Graduate身份進來的轉職者,真的讓我覺得,其實自己轉的好像也不太晚。當然他們比我有毅力很多,很多人都是Bootscamp出來的,有的人甚至快要40歲了才以一個畢業生的身份進來。
我覺得在英國很好的一點是,這邊有很多公司可能願意收這種,想要轉職工程師的人。這些人有的可能甚至沒有唸過大學。
公司一個跟我一起onboard的資深工程師,他告訴我他沒有唸大學,全是靠自己學的,但網路上有很多開源專案他都是主要貢獻者。我覺得很厲害。
來英國以後我一直在反省自己,覺得有時候就是,自己會過得太安逸,就不太想努力生活,又或者覺得努力的生活好累,我幹嘛要這麼累,甚至會有一種,反正我只要表現得比其他人好就好。
因為一直以來在台灣的生活成長環境,我覺得自己的價值是被社會被周遭的人定義出來的。例如你的學歷,你的工作職稱,你的薪水,你的資產。
有時候我會覺得自己可能是個悲觀的人,又或者是其他人喜歡隱藏自已過得不好的部分?每次我看別人的部落格,或者別人敘述自己的職涯時,總是覺得別人的職涯好像都過得很順遂。
一直以來我都覺得,自己的職涯好像不是很順遂,其實跟很多人比起來好像已經不錯,畢竟有個工程師的工作,還是在國外的工作。可是實際上我都覺得,自己好像是個很差勁的工程師,為什麼自己好像寫出來的code都很爛,為什麼自己好像什麼都不會,為什麼自己好像學東西學得很慢,還有自己就是一個,很怠惰的人。我沒辦法像很多人是,可以一直去摸不同的東西,例如看到個新的東西出來,就馬上想要打開電腦去碰,我也不是那種,遇到一個解不出來的問題就想要一直去解開的人。更不是那種可以一直帶著我愛的電腦,去世界各地旅行,沒事就打開來寫code的人。
所以一直以來,我也時常在懷疑自己,自己是否適合當一個工程師。
這幾年在英國認識了一些朋友,我也一直覺得其他人都很優秀,尤其是當我一個很好的朋友說,他喜歡選擇困難的事情來做的時候,我真的覺得很愧疚,因為一直以來我都在嘗試避免困難的事情,大概也是因為這樣我開始覺得,自己是不是根本不適合當一個工程師,因為我根本不想要做有挑戰性的工作。
可是回顧自己以前在DHL做個海運OP的工作的時候,又覺得自己在那種環境下,很容易疲乏,就是那種,我該學的都已經學玩,然後每天接電話打電話發Email, 遇到的問題也都是用類似的方式去處以就可以解決。我也覺得自己沒辦法就這樣做個十年二十年。
當然那樣的生活還是有好處的,至少你不工作的時候可以全心全意的放空,也不用每天回家還要擔心deadline, 擔心code寫不出來,或者去想到底要怎麼寫,也不用整天擔心新的東西出來,沒辦法跟舊的東西相容,或者是不學新的東西,自己會很快被淘汰掉。
有時候自己也在想,乾脆逃去其他國家寫程式會不會比較好?我們公司因為是全球性的,所以可以調派到其他國家,但是公司說,假設我們去了其他國家可能是senior level, 不代表我們在英國可能一樣是senior, 因為不同國家的科技和技術能力是不同的。這代表說,工程師即使在某個國家做到一定的程度,去其他地方也不代表一樣厲害,所以自己還是要不斷的學習最新的世界趨勢,學習新的科技,不眠不休。這也是為什麼工程師很容易過勞死吧!
以前在台灣一直加班我覺得是身體勞累,但現在我覺得自己比較是心靈上的勞累。我甚至覺得自己應該要早早退休,然後開一個小店之類的,來賣便當。
不過如果現在要我轉去做其他的職業我也不知道要幹嘛。即使都是工程師,都是科技業,也分得很細,尤其在英國都喜歡分門別類。工作到現在快三年,若你要問我我的強項是什麼,其實我也說不太出來,大概就是web 相關的東西吧!所以關於職涯規劃這件事情我也一直在思考。
我認為自己應該至少要有個什麼Machine Learning 的相關知識,然後一些系統設計,或者DevOps的能力跟知識要有。當然,大部分的人可能會問到,在英國如果當工程師,當到一定的歲數會需要轉管離職嗎?其實好像不一定,很多公司的管理職跟技術職都是分開的,也就是說你走管理也不一定會領比較多錢,反正有兩條路讓你選。有的人可能做到退休都是工程師。
在英國工作到現在,其實我還是常常會覺得很不順遂,不管是技術,文化還是語言,應該說也不是不順遂,就是不自然,當然很多可能還是跟我英文不夠好有關係,我雖然可能可以理解90%的內容,可是剩下的10%如果不懂還是讓人感覺煩躁。
當然現在的情況是比剛開始工作好很多了,至少很多技術的東西已經有經驗了。我覺得剛開始轉職並且在英國工作的時候,真的讓人覺得很心累,雖然說也可能是因為我的Team剛好都是英國人,不知道為何,即使是現在的公司,公司很多元化,我被分到的Team也幾乎都是英國人QQ
反正大概就是會有一個時期,或者偶爾在聊天的時候,你覺得別人在講的某個東西,你完全不知道是什麼。你可能就跟著笑這樣。。。或者在講一些專有技術的名詞時,別人可能知道,你卻不知道,就會有一種恐慌。
我自己是覺得這方面有逐漸改善一點點,希望我在現在的公司可以做得比之前好,至少我現在比較聽得懂大家的北方口音。
至於寫程式方面,還是一樣很心累,就有一種,無底洞的感覺,不管你怎麼學都學不夠,學不完。像是跑馬拉松但是永遠到達不了終點的感覺。從我一開始學寫程式到現在還是這樣。
但如果說可以回到以前剛開始學的時候,我想我應該會希望自己看到任何不會的東西都不要跳過。我知道那樣可能會變成學得很慢,可是很多時候,像是我們想要建立一個網站,可能我們會Google,然後就會看到很多建議,例如用WP, 或者推薦你用什麼vue, react, angular, 可是問題來了,即使你會一些基本的JS, 你可以用這些框架或library建一個SPA(一個網站), 你還是不知道它實際上是怎麼運作的。他底層是怎麼跑的。這樣會有什麼問題呢?
當你自己在家裡按照教學做都可以做得很開心,可是當你要改東西,或者在工作的時候,發生了問題,你就不知道該怎麼辦,因為你不知道到底發生了什麼事情,為什麼會報錯。
另一種學習路線是,好,我要學寫程式,然後你就開始去看學習物件導向,學Java, 初學者都是,學寫一個Class, 學習那些型別,然後寫個hello world, 按下那個play 鍵,他就自己開始跑一些東西,然後build好了,你就看到下面的視窗打出hello world, 接著教學就會說,那我們來簡單的寫一些function, 然後你就會寫出一些基本的加法function, 給他int a, int b, 就會跑出a+b的結果。
更進階一點可能會有一些題目是,印星星,或印九九乘法表,或者用Apache web server, 架一個簡單的網站。學一點html, 一點CSS, 一點JS, 讓他看起來漂亮一點。
這個時候你個課程就差不多結束,你也有一個作品。
如果你想要找工作,可能會發現,工作很多考的內容你還是不會,或者你開始工作以後,發現很多東西還是不會。因為前面你做的那些事情都只是,根據指示做,就像你去IKEA買了家具按照那個指示來做,可是傢俱本身都已經切好了,零件也都配給你。今天如果要你自己去工廠買那些材料才切割才做,設計一個櫃子,你也做不出來。
所以問題來了,到底要怎麼樣學寫程式?我覺得大概就是,在做那些教學的時候,去思考,我現在做的每一步,是為什麼,如果不知道,就去Google, 不要貿然的進行。然後做完教學以後,看看自己能不能做出一個跟教學類似但不一樣的網站,最好是可以不要一直看著教學。
可以拿白板或紙,來畫一些圖,想想自己要做什麼,例如我要做一個,賣衣服的網站,我需要什麼東西,或者我要設計一款小遊戲,我要創造幾個角色,要有哪些怪獸,要有哪些關卡。
我自己是沒有去過BootsCamp, 但感覺BootsCamp的訓練都滿扎實的。英國有滿多免費的(雖然大部分是Women in Tech)的,所以想轉職的男生們可能要找付費的。
很多BootsCamp也是保證找到工作的,找不到可能會退錢。或者可以嘗試那種網路上免錢的。
當你開始工作以後,你可能要開始思考,你寫的code乾不乾淨,你有沒有寫測試,甚至你可以嘗試練習TDD(測試驅動開發),思考怎麼樣可以寫出好的程式碼,什麼叫做好的程式碼,越簡單越好,簡單易懂,白話程式碼,如果今天一個不會寫程式的人,可以經過你的解說,看得懂你的code, 那你真的就大成功了。
為什麼說要簡單易懂,因為通常工作以後你寫的code不是只有你自己要看,還有別人要看,甚至一年後的自己要看,之後你是不是還看得懂,例如命名,例如空行,例如有沒有重複的?
像是在工作以後,很多同事會用一些詞彙,例如DRY(don't repeat yourself), 或者網路上也可以找到很多文章,寫說要怎麼樣寫出乾淨的程式碼。除了乾淨以外,還要思考延展性,就像DIY的傢俱,或者書櫃,你一開始可能買了一個兩層櫃,你會希望你如果要變成三層可以加上去。或者是床,沙發,你會希望他們是可以我不佔空間,好收納,或者可以延伸。寫程式你也希望你寫的一些東西是這樣子。例如共用的程式碼,你可以寫一個可以把'2019/12/03' 轉換成 ’兩千零九年十二月三日‘ 的function, 你會希望這個function, 可以被廣為使用,可以是'20191203', '2019,12,03', 進來都會被轉換成文字的寫法這樣,那你要怎麼做?可以先去思考以要做的事情,然後寫出測試
像是在JS很多的測試是非常口語化的
describe('dateConvert', ()=>{
it('should return date using word format', ()=>{
expect(dataConvert('2019/12/03')).toEqual('兩千零
九年十二月三日');
})
})
如果有錯誤請各位糾正
反正工作以後,寫測試變成一件很重要的事情,還有要怎麼寫,因為當其他同事在看你的code的時候,如果你有寫完整的測試,同事也會比較好看得懂你的程式在做什麼
當然,沒有一個開發方法是完美的,也沒有什麼完美的code, 即使寫完了以後,也要檢查看看自己能不能把它變得更好,像是使用 TDD就可以一直加上新的測試,然後去想能不能把它變得更好,去重構。
各位如果有興趣的話也可以買一些書來看,雖然很多書已經出版很久,可是程式設計,跟軟體工程這塊,經典還是經典,可以幫助你了解,為什麼現在我們都用C語言而不是A語言,B語言,為什麼我們大眾使用物件導向來寫程式,不是使用Functional programming.
當你工作越久以後,可能會越容易遇到,你要去選擇你要用的程式語言,你要用的框架,你要用的工具。
有一天我問我的同事,到底要怎麼貢獻開源,他說不要為了貢獻而貢獻,一般都是,你因為自己在用這個開源軟體,遇到了一些問題,所以你去把它改善,或者說你需要一個工具,可是你Google很久發現都沒有,於是決定自己做一個。
雖然我覺得以目前的我來說,還很難達到這種程度,但希望我有一天可以。就像Vue.js的創辦人因為覺得Angular.js不夠好,於是決定把好的部分留下,再加上自己覺得可以讓他變得更好的部分,創造了Vue.js
其實我自己也很害怕去討論這些非常技術的東西,我很怕自己講錯誤導大家哈哈
成為工程師真的需要很強的心臟,因為需要接受很多批評,很多反饋,才可以進步。當然有時候我也很玻璃心,常常因為被其他工程師點出自己的錯誤就心情不好,可是如果都沒有人批評自己,自己大概也不會進步。我想這大概是跟其他工作最大的不同吧!
以前在做海運出口的時候,即使可能做錯也不會一直被講,除非你真的是做了很嚴重的事情,不會你每接一通點話,每寫一封信都有人來看,有人來糾正,有人來說,你Email要怎麼怎麼改,你這樣寫不行。
可是寫程式,你寫出來的每一行code都可能被品頭論足,每一行code都要確保它的質量,當然我知道不是每個公司都有code review, 可因為我一直以來都有這個東西,也導致我覺得壓力滿大的哈哈
不知道分享這些會不會讓大家也覺得壓力大
code server教學 在 笑波子 Youtube 的最佳貼文
我要做「大皇帝」?
三國迷必玩! ;)
20號新SERVER 57S開左再講我叫咩名, 因為多數笑波子ID會被用... orz
新服送張飛+10萬糧CODE: DHDS57 (26號前用)
PLAY LINK: http://vda.icantw.com/?q=160517yCIAqaK
ʕ •ᴥ•ʔ 按此每天與我瘋狂見面:www.youtube.com/subscription_center?add_user=ylok999
想看更多有趣影片就分享支持吧! ;)
------------------------------------------------------------------------------------
Check out 波子's
◎Instagram: http://instagram.com/smilingboris#
◎Facebook: https://www.facebook.com/smilingboris
◎Email: ylok999@gmail.com
------------------------------------------------------------------------------------
O其他爆笑系列O
病橋模擬器: https://www.youtube.com/watch?v=84KSwmXmaHs
MOGEKO古堡: https://www.youtube.com/watch?v=yIccKXTB-us
小狗MUFFIN VLOG: https://www.youtube.com/watch?v=NV6eSkNfSBA
「波子舞教學系列」:https://www.youtube.com/watch?v=-DxxDJWT_J0
「OculusRift模擬真實遊戲系列」:https://www.youtube.com/watch?v=AnJxvmOhyDg&list=PLOOHaug3F2YxOW5-dQrGUjb9Sp5hct3J8
「Cat Mario惡搞遊戲」 :https://www.youtube.com/watch?v=GVMfOdBj1cU
「魔女之家系列」:https://www.youtube.com/watch?v=1DtGSpbiNY4
「OUTLAST前傳」:https://www.youtube.com/watch?v=NvdOALRMLYs
「Happy wheels系列」:https://www.youtube.com/watch?v=8V9ACyKlH0M
「South park衰仔系列」:https://www.youtube.com/watch?v=MDTGeHQ2z6E
「Goat Simulator模擬山羊」:https://www.youtube.com/watch?v=WxXrCtiuzqQ
「IB恐怖美術館」:https://www.youtube.com/watch?v=8eQ74ZsZ_DQ
「The evil within」:https://www.youtube.com/watch?v=_xWY5O-WxSk&list=PLOOHaug3F2Yy7vKMGYTgsD2RCsgvvJC8E
code server教學 在 笑波子 Youtube 的最佳貼文
30抽狂中角色!約大家「深情對話」活動?: 港呢啲【十萬個冷笑話】
係呢度Download有特別著數! 輸入埋虛寶code馬上變神手( ´▽` )ノ
1. Download link:
Google play: https://goo.gl/Axhu9X
IOS: https://goo.gl/5HOUyq
2. 再輸入code「fyefwhnbpa」, 就有遊戲貴重寶物「哪吒魂魄」!!!!
唔明睇呢度~
2016年1月8日晚上9pm-10pm,王二Server,Game中見!
到時加左我好友先私聊到YO~ 我角色名: 波子真人
希望到時聽到你錄音啦XD
想看更多有趣影片就分享支持吧! ;)
------------------------------------------------------------------------------------
Check out 波子's
◎Instagram: http://instagram.com/smilingboris#
◎Facebook: https://www.facebook.com/smilingboris
◎Email: ylok999@gmail.com
------------------------------------------------------------------------------------
O其他系列O
病橋模擬器: https://www.youtube.com/watch?v=84KSwmXmaHs
MOGEKO古堡: https://www.youtube.com/watch?v=yIccKXTB-us
小狗MUFFIN VLOG: https://www.youtube.com/watch?v=NV6eSkNfSBA
「波子舞教學系列」:https://www.youtube.com/watch?v=-DxxDJWT_J0
「OculusRift模擬真實遊戲系列」:https://www.youtube.com/watch?v=AnJxvmOhyDg&list=PLOOHaug3F2YxOW5-dQrGUjb9Sp5hct3J8
「Cat Mario惡搞遊戲」 :https://www.youtube.com/watch?v=GVMfOdBj1cU
「魔女之家系列」:https://www.youtube.com/watch?v=1DtGSpbiNY4
「OUTLAST前傳」:https://www.youtube.com/watch?v=NvdOALRMLYs
「Happy wheels系列」:https://www.youtube.com/watch?v=8V9ACyKlH0M
「South park衰仔系列」:https://www.youtube.com/watch?v=MDTGeHQ2z6E
「Goat Simulator模擬山羊」:https://www.youtube.com/watch?v=WxXrCtiuzqQ
「IB恐怖美術館」:https://www.youtube.com/watch?v=8eQ74ZsZ_DQ
「The evil within」:https://www.youtube.com/watch?v=_xWY5O-WxSk&list=PLOOHaug3F2Yy7vKMGYTgsD2RCsgvvJC8E
code server教學 在 #分享使用VS Code 遠端開發 - 軟體工程師板 | Dcard 的推薦與評價
B10 搜尋vscode wsl 應該有教學文啟用ubuntu子系統後,安裝vscode wsl套件就可以使用了跟B3說的是差不多的東西,不過可以不用裝docker code server ... ... <看更多>
code server教學 在 使用VSCode Remote透過SSH 進行遠端開發 - gists · GitHub 的推薦與評價
Server ~~~~0.0.1.0; 如果服務在解除安裝時仍在使用中,則在移除OpenSSH 之後可能需要重新啟動Windows. SSH 伺服器初始設定. Start-Service sshd. ... <看更多>
code server教學 在 Visual Studio Code 外掛自助餐|#2 LiveServer 深度探索 的推薦與評價
... <看更多>