焦利杰
(河南質量工程職業學院,河南 平頂山,467000)
一維條形碼一般是指水平方向存儲信息的條碼條和空的排列規則,它的數據容量較小只能容納30 個左右包含字母和數字的字符,由一維條形碼發展演變而來的二維碼是利用一些黑白相間的幾何圖形按照一定規則在水平和垂直方向的二維空間存儲記錄數據符號信息的條形碼,使用特定的掃碼軟件通過二維碼圖像進行讀取信息并自動處理信息。二維碼(Quick Response Code)起源于20 世紀70 年代日本Denso Wave 公司的Masahiro Hara,由于當時的汽車零部件需要追蹤和匹配大量不同的信息,傳統的條形碼信息容量和編碼范圍非常有限,二維碼的發明應時而生,解決了如何在產品標簽上存儲更多的產品信息的問題。中國對二維碼技術的研究始于1993 年,隨著中國市場經濟的不斷完善和信息技術的迅速發展,中國物品編碼中心在國家的大力支持下,制定了兩個二維碼的國家標準,二維碼網格矩陣碼和二維碼緊密矩陣碼,促進了我國自主知識產權的二維碼研發[1]。隨著我國網絡技術和移動終端的不斷發展,二維碼已經廣泛應用于生活之中,因其制作簡單、成本低廉、使用方便等特點,使得許多不法分子利用二維碼作為新的犯罪工具,進行病毒和木馬的傳播導致隱私或者身份信息的泄露,或者誘導用戶進入釣魚網站導致財產的損失。鑒于此,本文依托二維碼的生成原理對二維碼的應用領域以及面臨的安全問題進行了深入分析,以提高二維碼技術應用和安全方案的可行性。
隨著中國市場經濟的不斷完善,二維碼技術的應用彌補了條形碼信息存儲能力弱和空間利用率低的缺點,提高了信息數據容量的存儲能力,促進了商品經濟和移動終端金融支付的發展。
(1)數據容量存儲能力大
最多可達1850 個大寫字母或2710 個數字或1108 個字節或500 多個漢字。
(2)編碼范圍廣
二維碼可以使用圖片、文字、聲音等信息進行編碼。
(3)容錯能力高
局部污損不影響信息的識別。
(4)糾錯和譯碼可靠性高
譯碼錯誤率不超過千萬分之一。
(5)制作過程簡單,成本低廉
(6)條碼尺寸相對小,符號形狀和尺寸比例可以調節
(7)可以使用光耦合裝置(Charge Coupled Device)掃描器識讀
按編碼模式進行分類的話,二維碼可以分為矩陣式二維碼和行排式二維碼,它們具有不同的編碼原理。矩陣式二維碼通過黑白像素分布在一個矩形空間不同的位置進行編碼,在元素位置上用方點或圓點來表示二進制的1,空白表示二進制的0[2]。矩陣式二維碼是一種圖形符號自動識讀技術,主要依托計算機圖形技術和組合編碼技術。行排式二維碼可以從字面上理解為多個一維碼按需堆積而成,編碼、解碼和識讀方式也具有一維碼的特點,而且識別設備和條碼印刷也與一維碼相兼容[3]。
二維碼尺寸的官方稱謂是Version,最高具有40 個尺寸,Version1 是21×21 的矩陣,每增加一個版本就會增加4 個模塊,計算版本的公式是(Version-1)*4+21。
示 例:Version2 的 計 算 方 法 就 是(2-1)*4+21=25,即Version2 是25×25 的矩陣。
數字編碼的區間是從0 到9,把需要編碼的數字分成每三位一組,然后轉換為10bits 的二進制,不足三位的單獨一組。字符編碼包括0 到9,大寫的A 到Z 以及符號$、%、*、+、-、.、/、:和空格,字符需要先兩兩分組,然后轉換成字符索引表中(表1)相對應的45 進制的數,再轉成11bits 的二進制,然后進行二進制轉換[4]。如有尾部有單數,需要轉換成6bits 的二進制。

表1 字符索引表

表2 模式指示符
舉例一:在Version1 版本下,數字編碼12345
(1)把12345 每三位分成一組,不夠三位的單獨成組,結果是123 45

表3 字符計數指標的字節位數
(2)Version1 的數字編碼需要轉換為10bits 的二進制,把123 和45 分別轉換為二進制,結果是0001111011 101101
(3)根據表3,Version1 數字長度用10bits,把數字編碼12345 的數字個數5 轉換成二進制是0000000101
(4)根據表2,數字編碼的模式指示符為0001,然后把模式指示符和數字個數的二進制加到前邊,結果為0001 0000000101為0001111011 101101
舉例二:在Version1 版本下,字符編碼QR-C
(1)從表1 字符索引表檢索QR-C 的值,分別為(26 27 41 12)
(2)把值每兩位分為一組,(26,27),(41,12)
(3)先轉換為45 進制,然后再轉換為11bits的二進制
(26,27)轉換為45 進制,26*45+27=1197,轉換為二進制是10010101101
(41,12)轉換為45 進制,41*45+12=1857,轉換為二進制是11101000001
(4)根據表3,字符個數4 應轉換為9bits 的二進制,結果為000000100
(5)根據表2,字符編碼的模式指示符為0010,然后把模式指示符和字符個數的二進制加到前邊, 結果為0010 000000100 10010101101 11101000001
結束符為0000,我們還需要在尾部添加結束符。示例(表4):

表4 結束符
所有編碼的位加起來如果不是8 的倍數,還需要在尾部不足8 位的補0,最后按8bts 每組進行分組。示例:00100000 00100100 10101101 1101000 00100000(表5):

表5 不同等級數據容量
Version1 H 級糾錯級別最大需要72 個bits,如果沒有達到還需要用Padding bytes(補齊碼11101100 00010001)補足。示例只有40 個bits,因此還需要補足32 個bits。
正是有了糾錯機制才使一些污損殘缺的二維碼能夠正確的識讀出來。糾錯水平分為L、M、Q、H四個級別,在對數據碼添加糾錯碼時,需要先對數據碼進行分組(表6):

表6 Version5 糾錯特性
糾錯碼塊(c,k,r)中c 為碼字總數,k 為數據碼個數,r 為糾錯碼容量。以Version5 H 級為例,表6中指出有兩組碼,每組碼又被分為兩塊,第一組每塊碼字總數都是33,包含11 個數據碼,22 個糾錯碼,第二組每塊碼字總數都是34,包含12 個數據,22 個糾錯碼(表7):

表7 糾錯碼塊
最終編碼需要把數據碼和糾錯碼按照塊從上到下從左到右的順序組合到一起。先把每塊的第一個數據取出來然后按照從上到下的順序排列,然后取每塊的第二個數據按照從上到下的順序排在之前數據的后邊,最后依序排列至結束。糾錯碼也是采取同樣的方法,然后排列在數據碼后邊就組成了數據區。

圖1 二維碼信息
定位圖案是一個7×7 的矩陣,位于二維碼的三個角。對齊圖案是一個5×5 的矩陣。不同版本的對齊圖案的個數也不相同。例如version8 在行列值6,24,42 的幾個點都會有對齊圖案,一共有6個。時序圖案是兩條用于連接三個定位圖案的線(圖1)。
格式信息是一個固定15bits 的信息,其中數據位占5bits,糾錯位占10bits(圖2)。

圖2 格式信息
Version7 及以上版本需要加入版本信息,大小固定為18bits。圖1 中指向陰影部分的版本信息填充方式如圖3。

圖3 版本填充方式
數據填充按照先數據碼后糾錯碼的順序,從二維碼的右下角開始按蛇行方向上下移動填充,遇到非填充區域時需要避開。
最后一步使用蒙版圖案進行掩碼,如果出現大面積的空白或黑塊會影響掃描識讀,所以蒙版圖案是為了避免黑白模塊的不均衡。蒙版圖案共有8 種,原圖數據區域與蒙版進行異或操作后更容易識讀(表8)。

表8 蒙版公式
二維碼整套編碼流程如圖4 所示[5]。

圖4 編碼流程
(1)智能終端及操作系統
智能終端包括手機、平板等一系列嵌入操作系統的設備,同時也是用戶使用二維碼掃碼支付的一類設備。智能終端的操作系統一般包含安卓、windows phone 和蘋果移動操作系統,操作系統為應用軟件APP 提供了運行環境,如硬件軟件支持、存儲空間等,同時也為應用軟件運行的安全提供了保障基礎。
(2)支付軟件
支付應用軟件是支付系統的重要環節之一,主要應用于存儲交易信息、賬戶信息、購物和支付的平臺信息,它主要有認證性、隱私性、完整性和機密性等特點。二維碼的讀取、支付指令以及處理結果都是通過軟件完成的,以上二維碼的特點能夠保證用戶的個人信息和支付信息在未授權的情況下不被盜取或泄露,在最大程度上確保了用戶支付安全。
(3)網絡
網絡設備和通道是二維碼支付的基礎,也是必要條件。
(4)支付接入平臺
接入平臺是處理用戶軟件支付請求的軟件系統,它主要包括交易系統、商品管理系統和結算系統等。
支付流程是指在智能終端上的二維碼的識別、支付平臺的訪問方式、支付平臺的接入、交易的處理以及結果的反饋等一系列操作(圖5)[6]。支付平臺的接入包括支撐系統、商品管理系統、交易系統、支付系統以及結算系統等操作的處理。支撐平臺包括軟件硬件、用戶的賬戶處理信息、用戶資金管理以及統計分析等處理。商品管理系統包括商品信息、用戶信息、交易信息、支付平臺的接入、交易的處理、商品的反饋等操作。交易系統包括訂單的管理、交易管理、支付接入等操作。結算系統包括支付接入、生成電子憑證、結果處理等操作。

圖5 支付流程圖
二維碼的支付可以分為商品二維碼和支付二維碼。商品二維碼通過二維碼的識別直接指向商品管理系統的商品銷售,跟支付系統平臺沒有直接發生關系。支付二維碼是通過應用軟件直接接入支付平臺生成支付指令。它們的區別在于生成支付指令的環節是直接還是間接。
(1)獲取數據信息
識讀設備可以獲取由小程序、資料、密碼、地圖和名片等數據生成的二維碼信息。
(2)網頁跳轉
可以通過掃描二維碼實現網頁的跳轉瀏覽。
(3)電商移動支付
通過銀行或第三方支付app 掃描商品二維碼完成下單和支付。
(4)超市收銀
通過CCD 掃描器獲取商品信息并通過移動終端支付。
(5)商品防偽溯源
通過掃描二維碼追溯從原材料的采購過程、原材料到成品的制作過程以及成品到客戶手中的物流信息過程。
(6)名片和廣告推送
通過二維碼配送名片和廣告信息。
(7)醫學領域
對藥品、檢驗和人員等信息進行編碼可以實現高效管理。
二維碼給人們帶來便利的同時也帶來了安全隱患,它本身是沒有安全威脅的,但是不法分子會利用二維碼鏈接病毒造成用戶損失。任何新技術的應用都是有利有弊的,這也是互聯網發展的一個必經階段,我們需要做的就是把過程中存在的風險隱患降到最低點。解決安全問題的對策有很多,例如:
(1)建立健全相關法律法規和管理制度
(2)加強用戶安全意識和安全教育
(3)采用加密技術。
1)基于公鑰基礎設施(Public Key Infrastructure)技術基礎之上的數字證書能夠保證信息傳輸的機密性、真實性、完整性和不可否認性,能夠保證信息的安全傳輸。原理是通過把需要傳輸的數字信息進行簽名并利用用戶的公約對二維碼進行加密,所以掃描二維碼時需要利用用戶的私鑰解密否則不能使用二維碼[1]。
2)Diffie-Hellman 密鑰交換技術解決了實際密碼學中非對稱密碼方案的密鑰分配問題,允許通信雙方通過不安全的通信信道來傳輸密鑰而不會導致密鑰丟失[7]。基本思想是保證二維碼來源識別通過后才能繼續讀取二維碼中的信息,有效解決了掃描非法二維碼的問題。
3)使用屬性加密算法對用戶定義的密碼及用戶的屬性進行處理,保證一人一密的同時,滿足不同權限用戶對不同權限輸入信息的獲取需求,防止了權限信息的私鑰的泄露,從而保證了信息的安全傳輸[8]。
4)Advanced encryption standard(高級加密標準)是加密和解密使用相同密鑰的一種對稱加密算法。AES 算法是一種簡單、高效和可靠的加密算法,它的數據塊和密鑰長度相同,且有16 字節、24字節和32 字節三種,主要有密鑰擴展、輪密鑰加、字節替換、行移位、列混淆等加密步驟,同時密鑰越長,加密輪數越多,安全性也就越強[9]。使用AES算法先對二維碼數據進行加密,然后對密文進行二維碼編碼,可以保障二維碼傳輸過程不被截獲和破譯,等需要獲取二維碼信息時再輸入與加密時相同的密鑰,從而保證了信息安全。
Rijndael 是AES 中使用的一種基本密碼算法,利用Rijndael 加密算法和SHA512 哈希函數數字簽名技術混合加密的方法,對Rijndael 第一次加密密鑰系統隨機分配并對系統隨機分配密鑰采取二次Rijndael 加密防護方法,然后通過SHA512 對二維碼內部信息防篡改校驗,達到對二維碼信息及其加密密鑰的安全保護,在生成二維碼之前實現了信息加密,提高了二維碼信息的安全性并達到對密鑰高效管理和對信息的保護[10]。
5)RSA 是一種能夠同時用于加密和數字簽名且使用不同的加密密鑰和解密密鑰的非對稱加密算法。RSA 的密鑰長度隨著保密級別的提高而增長,所以其安全性很高,但在同等數據量下,因其進行的都是大數計算,所以不論在軟件還是硬件實現上,加密速率一直是其缺陷[11]。基于優化后的RSA 二維碼加密技術不僅安全性高而且加密速率有較大的提高,能夠有效保障二維碼數據信息存儲、傳播、識別,是一種快速簡單高效的解決方案[12]。
非對稱密鑰的公鑰對外公開,私鑰個人保密存儲,公鑰用于加密會話密鑰和驗證數字簽名,私鑰用來解密,RSA 就是非對稱加密算法的典型代表。基于非對稱加密技術對服務端和移動客戶端二維碼制作識別過程進行規范化和制度化管理,并且結合虹膜生物特征識別技術對用戶進行實名認證,間接實現數字證書與用戶物理身份綁定,從而滿足二維碼安全管理的規范要求[13]。
隨著互聯網和移動終端的快速發展,二維碼已經廣泛應用到各行各業,本文在對二維碼生成原理和應用安全進行分析研究后發現,二維碼的價值絕不僅僅局限于信息存儲、信息展示和網頁跳轉,信息安全始終都是關注的焦點,應著力研究和解決二維碼應用中存在的安全問題,從而提高互聯網總體安全性能。