首頁 > 軟體

1Password Linux版釋出,完全用Rust重構

2021-05-19 14:30:06

今天著名密碼託管軟體1Password正式推出了Linux版本的支援。其釋出公告中指出該版本的後端是完全用Rust重寫的。看來時下用Rust重構系統是一個趨勢,我們一起來學習下1Password開發團隊是如何做的?

概述

1Password是由agilebits 推出跨平臺密碼管理應用,適用於Mac,iOS,Windows,Android,Linux和Chrome作業系統的應用,支援各種瀏覽器擴展支援:Safari,Chrome,Firefox,Edge、Brave。

1Password for Linux版本的開發是以一個種全新探索的方式開展的,從團隊組織,程式語言和工具包,設計語言和流程,一直到新的部署,打包和測試過程。他們從嘗試Rust,到完全用實現是一個很值得學習的過程。

1Password Linux是一個混合應用程式。後端是用Rust編寫。Rust是一種真正的系統程式語言,以其安全性和效能而著稱。Rust直接編譯為本機程式碼,並避免了與運行時或垃圾回收相關的開銷。其前端Web介面是用TypeScript和React開發的,這也是一個很主流前端方案。其架構如下圖:

手動整合

在建立混合應用程式的新方法問世之前,所有平臺上使用完全不同的後端編寫所有應用程式。當其連線到相同的1Password服務時,各自需要手寫程式碼進行了連線。每個平臺都需要負責同步,衝突解決,資料儲存,為UI創建檢視模型以及可以想象的所有其他事情。

每個團隊在編寫本文時都使用了每個平臺上可用的最佳語言和庫。

可以想象,每個平臺上的功能奇偶校驗(和錯誤奇偶校驗!)保持一致,但是使用如此多的程式碼庫很難做到。

愛上Rust

1Password Windows團隊是從2017年率先使用Rust的。他們就喜歡了Rust,並在2018年5月釋出了Windows 7.0.558版本該版本中大量使用Rust進行了繁重的工作。

Windows上的崩潰和錯誤報告數量迅速下降。儘管如此出色,但其他團隊卻花了更長的時間才能看到使用Rust好處。當時很多團隊都在使用Golang創建一個供1Password使用的共享後端。

除了GopherJS可以編譯為JavaScript之外,還對Golang所需的一切提供了支援。

當開始嘗試WASM時,發現Rust可以很好地編譯到WASM並具有可靠的工具鏈,於是1Password其他團隊中開始嘗試Rust。

他們開始了一項實驗,將核心從Golang移植到Rust。

很快,從對Rust一無所知變成了在瀏覽器中的填充原型,這標誌著1Password整個開發的巨大轉折點。真在此時他們才明白了, Windows團隊說的都是真的,不是吹牛:Rust是真正的棒。它快速,安全,並且能夠編譯到包括WASM在內的每個平臺。

從小步驟到完整的Linux應用

為了確保Rust的熱情,能變成真正的線上應用。1Password團隊製作了一個小型庫來匯出基於時間的一次性密碼(TOTP),並將其運送到所有桌上型電腦和移動應用程式中,還在瀏覽器擴展中交付了新的WASM引擎。

結果非常順利。除了推出的順利程度外,沒有其他驚喜。

至此,Rust已經證明了自己,剩下就是用Rust創建完整的1Password核心。1Password Linux版本做了一個試用場成了Rust的用武之地。

僅僅幾個月,1Password 的Linux早期原型開始演示。

接著,事情變得越來越好,團隊對Rust也更加滿意,也不斷招人,團隊不斷壯大。到2020年8月,已經啟動了第一個開發預覽版本。在2020年10月,啟動了beta測試版本。

在1Password Linux版本釋出的同時,也提供了一個可以跨平臺通用的1Password核心,核心可在將來在每個平臺上使用。

核心之美

Linux版本的主要目標之一是創建一個可用於與1Password線上服務互動的通用核心,並在一個地方執行儘可能多的繁重任務。

經過一番迭代後,1Password團隊決定核心基本上應該是沒有UI的完整客戶端應用程式。核心將擁有自己的運行時迴圈,該迴圈將處理成為1Password客戶端的含義的各個方面,併為每個要使用的UI提供安全且難於濫用的API。

首先,核心是完全獨立的,並具有供客戶端應用程式使用的明確定義的API。

op-app和 op-ui板條箱將所有其他板條箱拼接在一起,以提供每個應用所需的一切。大多數狀態完全保留在內部,以確保正確處理金鑰和其他機密,並使每個客戶端UI專注於自身的優勢,而不是業務邏輯。

每個平臺也都有各自的優勢,因此foundation板條箱使核心可以接觸特定於平臺的服務,例如核心金鑰環和生物識別。

最有優勢的構建驗證測試,BVT也是用Rust編寫的,並且可以直接使用API和檢視模型來自動化測試。所有測試可以用GitLab CI有在合併請求期間自動運行這些測試的工作,這極大地減輕了質量檢查團隊的負擔。

而且由於可以根據需要啟動儘可能多的無頭客戶端,因此能夠測試併發方案或其他難以手動設定的情況。

未來的目標是使整個運行時可以在WASM中運行,以便可以替換TypeScript實現。

總體而言,這種新的1Password核心方法非常成功。下一代1Password應用中將全部使用它。

總結

恭喜1Password釋出Linux版本,同時也完成了完整架構轉型和開發團隊昇華,而這一切的魔力是因為使用Rust語言。關於轉型這些年非常流行,什麼機遇中介軟體,基於訊息系統、基於什麼中臺,基於微服務等等,往往都是忽悠的多幹貨少。那麼我應該如何轉型呢,對Rust我們還需要觀望麼?也許1Password團隊給我們些許的啟示。


IT145.com E-mail:sddin#qq.com