[Solidity][區塊鏈安全入門]Solidity語言關於密碼學知識的運用以及存在漏洞

青禾与共發表於2024-06-25

密碼學
區塊鏈透過密碼學演算法想要實現的性質有:機密性 完整性 身份認證和不可否認性
對稱金鑰演算法:透過安全的方式或者通道去共享加密金鑰 但是沒有解決不可否認性,意味著所有擁有金鑰的人都能加密 每當有成員離開時,金鑰需要進行更新
常見的對稱密碼演算法:

公鑰密碼演算法&非對稱金鑰演算法
每個使用者都有公私鑰對
常見演算法

雜湊函式
根據訊息內容得出唯一的 有固定長度輸出值的函式 如SHA-1 SHA-2 MD5 等,通常又稱雜湊演算法
可以用於數字簽名和檔案校驗等,只能單向運算
數字簽名的兩個明顯作用:向接收方保證資訊來自宣告的傳送者 且過程中不可否認;向接收方保證傳輸過程中不會被改變
同態加密:在不透露出後設資料的情況下,對同態加密的資料處理後再將輸出進行解密,與後設資料按照同一方法進行運算的結果是一樣的
代數同態:既是加法又是乘法同態 算術同態:同時滿足加減乘除四種同態
同態加密是一種公鑰加密演算法 能夠讓密文擁有計算功能 無需解密就能直接對密文進行處理,使用同態加密可以讓智慧合約能夠處理密文,但無法獲得真實資料,極大提高隱私安全性
零知識證明:
證明這可以在不向驗證者提供更多有用資訊的情況下,使驗證者相信某個論斷是正確的。如使用者註冊密碼的儲存 向實習公司提供未掛科證明卻並未看到成績 用公私鑰驗證身份等
在區塊鏈的世界中,用地址來表示交易雙方,這樣達到了匿名的作用。然而,鏈上的資訊雖然是匿名的,但是透過鏈上資訊繫結的鏈下資訊,像很多交易所都繫結了鏈上地址與鏈下的銀行賬戶、支付寶,這樣可以很方便的追溯真實世界的交易雙方,使得匿名性蕩然無存。
那麼,有沒有一種方法,能夠在隱藏傳送方、接受方以及交易金額等其他細節的情況下,保證交易有效呢?

 答案就是:零知識證明
 透過利用零知識證明機制,可以將交易雙方的地址、交易細節隱藏起來。
 目前ZCASH(大零幣)使用零知識機制來證明交易有效,在ZCASH中,摒棄了之前的UTXO方式,而是使用了一種基於UTXO,被稱為NOTE(支票)的新方式代替。NOTE代表了當前賬戶對資產的支配權,與UTXO不同,賬戶餘額的儲存方式不再是“未消費的交易輸出”,而是“未被作廢的支票(NOTE)”;一個NOTE是由所有者公鑰PK、所擁有金額V、和唯一區分支票的序列號r組成,表示為NOTE=(PK, v, r)。

ZCash交易分為兩類:透明地址交易和隱藏地址交易。透明地址交易的輸入、輸出直接是可見的NOTE資訊;
隱藏地址交易,輸入和/或輸出的地址和金額是隱藏的。
在ZCASH的隱藏地址交易中,交易的輸入輸出不再是明文的NOTE,而是NOTE的簽發和廢棄通知。如下圖:

左側代表的是“簽發的新的NOTE”,右側代表的是“作廢的NOTE”。每次進行轉賬,就會把轉賬方的NOTE放到作廢列表裡,代表此NOTE已經作廢,同時為收款方建立一張等額的NOTE。這樣就實現了“資產的轉移”,並且由於都是記錄的NOTE的雜湊值,因此並不知道被廢棄的和新簽發的NOTE的內容,這樣就做到了隱藏交易雙方及交易細節。

環簽名技術(把身份藏進人群裡 從而保護簽名者) 典型的應用案例 :門羅幣
環簽名中籤名者利用自己的私鑰和集合中其他成員的公鑰就能獨立簽名,集合中的其他成員可能不知道自己被包含在內

隱私威脅和保護:
使用者身份隱私主要是指交易雙方的地址資訊:
通常用的方法是混幣機制,即將多筆交易混合在一起,切斷交易方和接收方的聯絡。提高加密貨幣的隱私性和匿名性。
混幣過程的執行可以由可信第三方或者某種協議去執行 混幣機制也可分為基於中心化節點的混幣機制和去中心化的混幣機制

網路隱私
分為節點隱私(伺服器地理位置,節點物理資訊,系統版本,節點IP等)和通訊隱私(資料流量,節點間資料明文和密文)
對公有鏈來說 攻擊者可以透過監聽,掃描技術對整個網路進行探測攻擊
應用隱私:
分為伺服器隱私和客戶端隱私
主要內容:支付流敏感資訊 瀏覽器cookie,金鑰存放位置,
威脅一般不是來自區塊鏈技術本身,而是使用者和服務商
服務商暴露隱私的源頭主要來自操作不當或者服務漏洞。如服務商授予使用者的許可權不匹配,服務商公開資訊中存在敏感資訊,外掛中存在漏洞

相關文章