李 凌,劉子豪
1(河海大學 計算機與信息學院,南京 211100)
2(江蘇科技大學 計算機學院,鎮江 212003)
隨著移動互聯網技術的興起,QQ、微信、微博等一系列移動互聯網社交平臺成為年輕人的新寵,越來越受人們的喜愛.在日常的學習、生活乃至工作中,我們都可以方便利用這些平臺完成和他人的信息交流,大大節約了交流成本.社交軟件中消息的通信主要由社交軟件的服務器先進行保存然后轉發給目標用戶,這不可避免在交流的過程中會在軟件的服務器上留下長期的數據副本,一旦服務器產生漏洞將有可能導致用戶大量歷史數據副本的泄露.本文根據目前對移動端數據安全自毀的需要,充分發揮微信現有用戶量大,推廣方便的特點,以一種基于網絡的數據自毀方法[1]作為服務器端的數據安全自毀基礎方案進行改進,使用嵌入在微信公眾平臺中的網頁發送原文件,利用客戶端以及服務期端的通信安全由TLS協議保證并結合基于微信的第三方網頁授權OAuth2.0[2]機制驗證用戶的身份構建出可以為移動端用戶提供基于微信的數據安全自毀的服務平臺.
微信是騰訊公司于 2011年 1 月 21 日推出的一款手機應用.微信用戶可以通過軟件與好友分享文字與圖片,并且支持語音、視頻等多功能的服務.微信公眾平臺是騰訊公司基于微信基礎平臺上新增的模塊,每個QQ賬號都可以打造屬于自己的微信公眾號,微信公眾平臺可以為特定群體提供自定義的服務.隨著微信與手機號的綁定,各種各樣基于微信身份的互聯網應用服務隨之產生.為了有效的獲取到微信用戶的基本信息,微信推出了第三方網頁授權OAuth2.0 機制.
微信網頁授權OAuth2.0 機制是用戶在微信中訪問第三方網頁時,公眾號通過網頁授權取得用戶基本信息,進而實現業務邏輯的機制.第三方網頁通過該機制獲取到用戶信息的前提有 2個.第一,授權的第三方頁面需提前在微信開發者中心進行域名配置.第二,被獲取信息的用戶必須在 48 小時內和公眾號有過最基本的數據交互,并且用戶處于關注該公眾號的狀態.當用戶點擊處理過的第三方網頁鏈接時,會首先自動跳轉到微信授權中心確認該鏈接是否是在指定的微信默認游覽器中打開以及鏈接的域名是否提前在微信的開發者中心配置過.若通過微信授權中心的驗證,則返回當前用戶OpenID所對應的一次性code,作為參數傳入重定向的業務頁面.在業務頁面中,服務商使用一次性code可以換取到對應的用戶包括OpenID在內基本信息,確保用戶身份的真實有效.
微信具有用戶量大,服務平臺使用方便,推廣迅速的特點.目前,社交軟件中帶有敏感數據的數據的泄露主要有以下兩個主要途徑:1、帶有敏感信息的數據在傳輸中泄露.2、存儲在服務器數據庫上的數據副本被竊取.由于社交軟件普遍使用HTTP協議進行通信,雖然對通信的消息內容部分進行過一定的加密處理,但其通信安全完全依賴于加密密鑰的安全,一旦密鑰泄露將導致通信安全的下降.并且在傳遞的過程中,數據都是以副本的形式進行傳遞,其不可避免的會在服務器上留下數據的副本.在服務器內,為方便調用用戶的數據,一般都會設置訪問權限,然而從烏云網上可以發現由于服務器漏洞的頻發以及部分業務邏輯設計的不合理,攻擊者常??梢苑欠ǖ墨@取訪問權限或者繞過訪問權限,獲取到大量的用戶歷史數據副本.
微信自發布運行至今,安全性問題時有發生.2014年發生了所謂的視頻泄露事件,后騰訊官方證實并非微信本身存在漏洞,但專家表示在微信內容分享機制中確有考慮不周之處.2016年8月,采用了X5內核的微信被證實存在高危安全漏洞,該技術漏洞將允許黑客取得微信的完全控制權,獲取包括微信隱私、聊天記錄、微信錢包等在內的信息[3].誰也無法保證今后不會再次出現類似的安全性問題.聊天記錄,賬單信息這些數據是否需要持久化存儲? 某些數據用戶因為隱私不希望持久記錄且不被任何人得知,希望實現真正的“閱后即焚”.但是這些記錄在“刪除”后仍然可以通過技術手段還原,因此數據的自毀就顯得很有必要.
本文為解決上述存在的問題,以一種基于網絡的數據自毀方法作為服務器端的數據自毀基礎方案進行改進,利用TLS協議保證通信傳輸中的數據安全,結合微信的第三方網頁授權OAuth2.0機制完成數據安全自毀服務平臺的構建.自毀服務器以公眾號為媒介,位于用戶端和微信服務端之間.用戶通過微信服務器提供的身份驗證功能登錄公眾號,利用公眾號為媒介傳遞數據,自毀服務器為公眾號提供加密解密以及自毀等功能.
基于微信的數據安全自毀服務平臺的數據流轉過程如圖1 所示.發送方用戶通過微信公眾平臺的自定義菜單打開數據上傳頁面,按照規定填寫好所需要的數據.將所有的相關數據直接發送給數據安全自毀服務器,傳輸過程的安全由TLS協議保障.數據安全自毀服務器利用接受到的數據對原數據進行加密分片處理,返回的SDD代理鏈接[4]包裝成微信規定的圖文消息的XML格式發送給微信服務器,如圖2.由微信服務器通過客服接口直接轉發給接收方用戶.接收方用戶通過點擊接收到的圖文消息的方式完成身份的驗證后,直接從數據安全自毀服務器上獲取到原數據.圖文消息封裝格式如表1.

圖1 系統信息流程表

圖2 XML文件

表1 參數描述
本文利用珠鏈模型(Bead Strand Model),將數據分為兩個部分,珠(Beads)和鏈(Strand).如圖3所示,珠被一根特定的鏈所連接.該模型與單純的鏈表不同,它是一個面向流數據的存儲結構,不僅僅提供了數據持久化,還涵蓋可眾多的數據類型.

圖3 珠鏈模型結構
利用該模型對數據流進行加密,并存儲進自毀服務器數據庫中.其過程分為4個步驟:
第一步,產生一個隨機值作為key,記作RandomKey,之后將輸入的數據和RandomKey結合一起進行加密,記作CipherData.通過使用對稱加密算法,獲得加密數據.本文具體使用了AES加密算法[5],該算法使安全性和有效性得到了平衡.
第二步,計算CipherData的哈希值,得到CipherHash.之后將CipherData拆分成不大于8 KB的片段,分別為Piece 1,Piece 2,Piece3等多個片段.之后將RandomKey,CipherHash和CipherData的長度合并成一個片段,記作Piece 0.如果任何一個片段的長度不足8 KB,不足的部分用隨機字節補充.選擇8 KB的理由在于,在java運行環境中,內存池能夠分配的最小緩沖單位默認為8 KB.
第三步,為每一個8 KB片段產生隨機UUID(version 4 UUID)[6],并為每一個片段加上時間戳標簽,記作ExpirationTime.每一個珠,都由UUID、其對應的片段和ExpirationTime構成.使用分布式數據庫來進行持久化存儲.通過對比ExpirationTime和當前的網絡時間,此數據庫會刪除過期或者失效的珠.對于ExpirationTime,用戶可以自行設置.但是如果同一條數據的所有珠存在同一個具體ExpirationTime,這會導致一個后果:攻擊者如果獲取了數據庫資料,就可以很輕松的區分哪些珠子屬于同一條數據.因此一種延遲機制被采用來降低這種風險:給每一個ExpirationTime隨機延時延遲0到3600秒,這樣可以提高復雜度,并使得珠之間有足夠的離散.
第四步,將片段中的UUID按順序結合起來,獲得由uuid組成的線,稱作鏈,任何擁有鏈的用戶可以獲得所有的片段,通過RandomKey破譯CipherData,通過Piece0中的CipherHash破譯數據.但是如果任何珠過期或者被刪除,即使你獲得了相應的鏈,你也無法獲得正確的珠以及數據.
以上4步的偽代碼展示如下:

算法. 數據加密與解密RandomKey = Generate ();CipherData = Encrypt (RandomKey,InputData);CipherHash = Hash (CipherData);Piece[0] = Combine (RandomKey,CipherHash,Lengthof(CipherData));

For n=1 To <Lengthof (CipherData)/(1024*8)>Piece[n]= Split (CipherData,(n-1)*1024*8,(n)*1024*8);End For For Each Piece in Piece[n]UUID = GenerateUUID ();CreateBead(UUID,Piece,ExpirationTime.addSeconds(RandomDelay.ToSeconds ()));Strand = Strand + UUID;End For Strand = “SDD://” + Strand;Return Strand;
其中SSD (self-destructing data)鏈接將暴露出作為URL (Uniform Resource Locator),因此用戶可以以一個<img>標簽的形式將其嵌入任何基于HTML(HyperText Markup Language)的文檔中.任何收到SSD鏈接的人可以使用支持HTML的Web瀏覽器來閱讀SSD信息.原型系統架構展示如圖4.
3.3.2 印度紫檀種植管理。種植前應安裝好排噴灌設施。挖坑規格為40 cm×40 cm×40 cm,在種植前30 d每坑施放3 kg經堆漚的有機肥料,后回土種植。

圖4 原型系統架構
但是HTML文本依賴于HTTP (HyperText Transfer Protocol)[7]中的GET方法,且最大長度為2048個ASCII字符[8].這意味著我們無法顯示一個2054個字符的鏈作為HTML文本.
Geambasu使用火狐插件將密碼數據轉成純文包[9],基于此也可以將SSD形式的URI轉換成解密文本[10],但是在公眾號場景下這種方式不適用.因此,我們設計了一種二級索引機制,當鏈創建成功后,對應生成一個單個的UUID用來做映射.用戶可以通過此UUID和鏈來取得數據.
總的來說,發送方通過這種模型將數據加密存儲,并獲得相應的鏈.接收方通此鏈,可以對離散的數據片段進行重新整合,從而達到解密的目的.解密之后,數據會被判定為過期數據,從而在存儲端被刪除.微信服務端提供的是身份驗證,具體的加密解密工作由自毀服務器來完成.發送方和接收方通過公眾號為平臺進行安全通信.可以將自毀服務器想象成一個盒子,一個人將要傳遞的數據撕成碎片放進盒子里,盒子會對應生成一把鑰匙和一段咒語.當另一個人拿著鑰匙將其打開后,看到只是一地碎紙,只有當他念動咒語后,碎紙才會自動整合成一段完整的數據,并在之后燃燒成灰.
數據安全自毀存儲流程如圖5所示,系統從發送方用戶獲取到四項數據,過期時間TOE、接收方用戶唯一標示符OpenID、原數據以及發送方的用戶唯一標識符所對應的一次性code值.其中前三項數據由發送方用戶填寫,code值則通過微信特有的第三方網頁授權OAuth2.0機制獲取,保證發送方用戶身份的真實有效.首先,使用接收方用戶唯一標識符OpenID作為密鑰對文件數據進行AES加密.完成一次加密后,使用隨機密鑰函數產生的密鑰對密文進行2次AES加密,對加密后的密文進行分片并將密鑰偽裝成一個密文分片,分片大小為1 K.隨機選擇一個分片添加時間戳屬性TOE,其他分片添加時間戳屬性.
TOE+random (3600*24*1000).由于文件數據還原需要所有的密文分片,此時間戳分配方案可以確保在用戶設定的過期時間后文件無法再被還原.同時同一文件密文分片之間的時間耦合性下降,防止可能的利用同一文件不用分片時間戳相同這一特性進行分析和攻擊.給每個密文分片記錄產生唯一UUID,并將其作為記錄的主鍵存入服務器的數據庫中.根據分片的順序將對應的UUID進行2次哈希后組裝成SDD代理鏈接,SDD包裝成微信規定的圖文消息的XML格式發送給微信服務器,由微信服務器通過客服接口直接轉發給接收方用戶.用一開始接收到發送方的用戶唯一標示對應的code值向微信服務器換取發送方的OpenID標識數據來源.服務器定時掃描數據庫,刪除時間戳早于當前時間的分片記錄.
數據安全自毀讀取流程如圖6所示,接收方用戶通過點擊圖文消息向服務器發送解密請求,服務器從接收方用戶獲取到指定SDD代理鏈接以及接收方身份所換取的對應的一次性code值.code值通過微信特有的第三方網頁授權OAuth2.0機制獲取,保證接收方用戶身份的真實有效.使用一次性code值向微信授權中心換取對應用戶的OpenID.服務器根據接收到的SDD代理鏈接向服務器數據庫申請相對應的密文分片,若分片都沒有過期被刪除則按照順序讀取所有的分片使用隨機密鑰進行的AES解密.使用之前換取到接收方用戶的OpenID作為密鑰進行 2次AES解密,解密成功則根據文件的類型向用戶提供在線預覽服務.

圖5 數據安全自毀存儲流程
通過微信公眾號發送安全自毀文件如圖7所示,用戶由微信公眾號下單的自定義菜單的上傳文件的選項進去上傳文件頁面.一共有3項數據要求用戶填寫,分別是用戶所設定的文件安全自毀時間,所需要安全自毀的文件以及接收方用戶的OpenID.正確填寫后,點擊發送,若返回文件發送成功的提示則發送成功.

圖6 數據安全自毀讀取流程

圖7 微信公眾號文件發送頁面
通過微信公眾號接受安全自毀文件如圖8所示,接收方用戶接收到文件,點擊圖文消息,微信自動驗證當前用戶身份,若用戶身份正確且文件沒有超過過期時間,則可以獲取到文件的在線預覽.
在數據安全自毀服務平臺設計方案中,文件數據本身只與數據安全自毀服務器進行直接交互,并不會經由微信服務器進行轉發,也就不會在微信中留下長期的數據副本.客戶端以及數據安全自毀服務器之間的通信安全由TLS協議所保證,安全性高于微信所使用HTTP的通信.在微信的通信中,由文件的SDD代理鏈接作為解密憑證代為傳遞.在用戶試圖使用SDD代理鏈接作為解密憑證獲取原文件時,我們使用基于的微信第三方網頁授權OAuth2.0 機制的來獲取用戶的身份,并將其OpenID做為解密密鑰使用.當文件過期時間到達時,數據安全自毀服務器會刪除保存在數據庫中過期的密文分片,此時SDD代理鏈接失效,原文件再也無法再被還原,有效的防止了可能的大量歷史文件的泄露.

圖8 微信公眾號文件發送頁面
接收方用戶的圖文消息都是直接由微信公眾平臺以客服消息的模式所發送,唯一的身份標識符為雙方用戶在該微信公眾號中所特有的OpenID.由于微信公眾號OpenID的特性,即不同用戶對同一微信公眾號的OpenID不同,同一用戶對不同的微信公眾號OpenID也不同,攻擊者無法通過OpenID獲取到接收方或者發送方的其他個人信息,而獲取SDD鏈接需通過微信的身份驗證機制才能正確的讀取文件,所以即使微信發送消息被攻擊者截獲分析也并不會對用戶造成任何安全性問題.
在用戶設定的過期時間內,文件數據受高安全性的加密方案所保護.而當有效期到達時,文件的密文分片會被服務器端數據庫自動刪除,文件無法再通過SDD代理鏈接被還原.下面給出過期時間內,隨機預言模型[11]下加密方案安全的簡單證明.
假設加密明文所用的隨機密鑰產生函數是一個隨機預言機,則攻擊者無法利用該預言機的弱點預測每次加密所用的密鑰,即該預言機所產生的隨機密鑰在其候選值域內均勻分布.在無法預測密鑰的情況下,由于該加密方案中明文加密后的密文被分片成等長的大小并且密鑰被偽裝成一個密文分片,所以服務器攻擊者將無法區別哪些分片是密文哪些分片是密鑰.假設密鑰數量遠小于密文碎片數量,則認為單個分片在概率上最有可能是密文碎片,此時攻擊者要尋找到密鑰相當于只能暴力破解.所以對單個文件的密文密鑰分片來說O(n)是窮舉加密算法密鑰空間的時間復雜度.
當數量巨大的密文分片存儲入數據庫時,數據庫中總分片數N將會足夠大,由于服務器攻擊者沒有解密憑證SDD代理鏈接,攻擊者若需要從分片中選擇屬于同一密文的密鑰與密文分片,也只能采取暴力破解.此時,該加密方案CCA選擇密文攻擊[12,13]時間復雜度最好情況下是n(n-1)=O(n2),最壞情況下則是n!=O(nn).而CCA選擇密文攻擊的平均開銷是每n個分片的讀取開銷乘以(N!+N*(N+1))/2 復雜度是O(nn).即在隨機預言模型下攻擊該方案所需的時間開銷無法使用多項式時間計算,加密方案安全.
本文針對我國現在社交軟件中帶有敏感信息數據泄露的現狀,設計和實現了一種基于微信的數據安全自毀服務平臺,完成了最基本的文件的加密存儲以及讀取功能,對該平臺的可行性進行了驗證.目前,該服務平臺主要支持圖片和pdf格式的預覽,如何支持更多格式的文件預覽以及進一步豐富服務平臺的功能多樣性將是下一階段的研究重點.