當前位置:
首頁 > 最新 > 詳解使用區塊鏈技術實現安全的二維碼網路認證

詳解使用區塊鏈技術實現安全的二維碼網路認證

越來越多的我們在許多應用程序中看到二維碼,部分得益於與區塊鏈技術相關的眾多項目。之前二維碼被視為中國等亞洲國家的獨特現象(如微信的QR碼),而如今,二維碼(QR碼)被廣泛用於認證,支付,信息交換等。

基本少量的信息傳輸到使用QR的移動設備可以很簡單(必須包括一個庫和少量代碼)。但是,當涉及到安全性時,基於QR碼構建方便和安全的解決方案將變得非常困難。同樣在大多數情況下,您還需要一個備用解決方案,例如,在沒有第二個屏幕的情況下執行認證。最近了解到的一些項目涉及網上銀行登錄移動設備支持存儲在以太坊區塊鏈上的身份,特細分享:

環境

對於移動開發,我們使用C#和Xamarin表單,在線銀行原型是用Ruby-on-rails編寫的。移動應用程序用於在以太坊區塊鏈上創建和管理身份。應用程序擁有以太坊秘鑰,這是所有的身份屬性(姓名,國籍等)和其他方面的證明(如大學的大學文憑)的核心。

目標任務是什麼

通常的身份驗證是在外部仲裁者的幫助下完成的,直接向消費者發送數據或提供驗證,例如OpenID Connect用於登錄Google作品。在我們的方案中,這一切都是通過區塊鏈架構提供的非對稱加密和簽名功能完成的。

在這種情況下,區塊鏈作為一個安全的存儲空間(從某種意義上說,那裡發布的信息是不能改變的)作為參與方。公共實體可以在那裡發布自己的詳細信息,例如像網上銀行提供他們的名字,以方便用戶。這隻能通過地址密鑰的持有者來完成,並與網站的SSL證書耦合在一起,為用戶提供強大的安全性和簡單的檢查身份信息接收方真實性的方法。

對於用戶來說,工作流程是不同的,因為個人信息不能公開,所以只有證明部分正在向區塊鏈發布,信息由一些外部驗證者(如我們的銀行)提供。

對於用戶來說,這允許與不同的ID消費者(例如銀行和在線商家)簡單地重用現有的身份,而不依賴於單個中央控制的實體。企業也可以從這種模式的簡單整合中受益,也可以通過獲得驗證來與其他實體建立信任關係。

認證程序

認證過程如下:

QR碼由以下代碼生成。我們正在為登錄會話建立一個唯一的標識符,並指定身份信息的接收者。由於QR碼的使用壽命較短,因此我們還必須包含時間戳,以便移動應用在請求過期時能夠顯示倒數計時器。

def qr_code( root_url ) params = { by: "0x5ddA491Bc5Fc1C7dC5A3B90078eA24d3b1407482", id: self.uuid, at: Time.now.to_i, eu: crypto_url(root_url), en: true, v: 1, }.to_query qr_string = "kycex://auth/request?#" puts "INFO: QR is: #" puts "INFO: crypto URL is: #" qr_string end

URI模式kycex是指由移動應用程序註冊的模式,以便能夠處理來自任何QR碼閱讀器應用程序的身份驗證請求。移動應用程序然後使用eu(加密URL)參數來檢索有效負載加密的公鑰。

def generate_key nonce = SecureRandom.uuid rsa_key = OpenSSL::PKey::RSA.new(2048) if rsa_key == nil puts "ERROR: could not generate session encryption key!" return end cipher = OpenSSL::Cipher::Cipher.new("des3") if cipher == nil puts "ERROR: could not encrypt key!" return end self.privkey = rsa_key.to_pem(cipher, nonce) self.pubkey = Base64.encode64(rsa_key.public_key.to_pem) self.nonce = nonce end

加密URL生成一個新的RSA公鑰/私鑰對。私鑰使用3DES對稱加密進行加密並存儲在本地。公鑰被返回給移動設備,而在本地丟棄。這確保了如果本地存儲被破壞,私人密鑰不能被清楚地讀取,並且在到達ID消費者之前不能獲得對加密的有效載荷的訪問。使用新的RSA密鑰對進行每次認證也會提高安全性,因為重複使用同一個密鑰對可能導致安全風險,例如違反一個會話會影響其他人。我們還在下面使用不同的密鑰進行簽名處理,因為重複使用相同的密鑰進行簽名和加密操作肯定會降低整體安全性C#中的RSA加密部分是使用BouncyCastle nuget包完成的

可以使用RSA加密加密的數量由選定的密鑰長度定義。在我們的例子中,這是2048位,最大輸入塊大小為245位元組。當使用PKCS1 OAEP編碼時,每個塊將轉換為256位元組,因為編碼增加了控制結構,並且由於熵增加使得密碼更加健壯,從而增加了總體安全性。如果明文塊小於245位元組,則通過編碼將其填充到正確的所需長度。這就是密文長度始終是n×256個位元組的原因。在Ruby的解密方面,可以使用相同的步驟(以相反的順序)

# Check if this session has stored encrypted private keyif self.privkey.nil? self.privkey.empty? raise "Session request in invalid state"end# We need a decryption key for our private keyif nonce.nil? nonce.empty? raise "Session request in invalid state"end# Use builtin OpenSSL API binding to initialize encrypted keyrsa_key = OpenSSL::PKey::RSA.new(self.privkey, nonce)if rsa_key.nil? raise "Session key decryption failed"end# HTTP POST contains base64 encoded payload# p now contains binary cyphertextp = Base64.urlsafe_decode64(payload)# As we know the key length and corresponding block size we set this manuallybs = 256i = 0json = ""while (i < p.length) begin # Decrypt each block individually using the correct encoding and padding json true)

可以看出,區塊鏈技術為以安全為重點的應用程序提供了良好的基礎,因為安全方面已經內置於協議本身中。另一方面,儘管區塊鏈已經存在了一段時間,但令我驚訝的是,對於以太坊和比特幣來說,橢圓曲線(EC)secp256k1密鑰的工作明顯缺乏良好的工具和庫。一個很好的例子就是以太坊的簽名驗證 : 至少我沒能找到一個適合Ruby的應用,並且不得不使用一個Bitcoin gem,這個Bitcoin gem是基於比特幣基礎的3年前的libsecp256k1實現。另一個潛在的改進領域是用於小型有效載荷的基於EC密鑰加密的庫。儘管從理論上講,OpenSSL沒有高級的包裝器,至少在Ruby中是這樣做的。

另一方面,由區塊鏈基礎設施支持的單一數字身份可以是具有共享令牌的傳統系統的主要優勢。雖然目前整體採用率很低,每個人似乎都對玩密碼市場更感興趣,但我發現在區塊鏈的幫助下,分散式透明身份驗證和身份數據共享的潛力巨大。

歡迎關注國內權威 區塊鏈行業分析公眾號:中本區塊


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 智客公會 的精彩文章:

區塊鏈技術將給世界帶來什麼?如何學習區塊鏈

TAG:智客公會 |