一、二維碼的分類二維碼,從字面上看就是用兩個維度(水平方向和垂直方向)來進行數(shù)據(jù)的編碼,條形碼只利用了一個維度(水平方向)表示信息,在另一個維度(垂直方向)沒有意義,所以二維碼比條形碼有著更高的數(shù)據(jù)存儲容量。 從形成方式上,二維碼可以分為兩類, 1、堆疊式二維碼:在一維條形碼的基礎(chǔ)上,將多個條形碼堆積在一起進行編碼,常見的編碼標(biāo)準(zhǔn)有PDF417等 圖1 PDF417碼示例 2、矩陣式二維碼:在一個矩陣空間中通過黑色和白色的方塊進行信息的表示,黑色的方塊表示1,白色的方塊表示0,相應(yīng)的組合表示了一系列的信息,常見的編碼標(biāo)準(zhǔn)有QR 碼,漢信碼等 圖2 QR碼示例 圖3 漢信碼示例
目前使用最廣的是QR碼,所以接下來的內(nèi)容會對QR碼進行講解,下文中提到的二維碼,指的就是QR碼 QR碼分為40個版本,版本1由21x21個方塊組成,每個版本增加4個方塊,版本40由177x177個方塊組成。每增加一個版本,QR碼可儲存的信息數(shù)量也隨之增多。 版本1的二維碼最多可以儲存25個字符或41個數(shù)字,而版本40的二維碼最多可以儲存4296個字符或7089個數(shù)字 二、二維碼的結(jié)構(gòu)一個二維碼可以分為兩個部分,功能圖形和編碼區(qū)域 圖4 功能圖形起到定位的作用 位置探測圖形:由三個黑白相間的大正方形嵌套組成,分別位于二維碼左上角、右上角、左下角,目的是為了確定二維碼的大小和位置。 定位圖形 :由兩條黑白相間的直線組成,便于確定二維碼的角度,糾正扭曲。 校正圖形 :僅在版本2以上存在,由三個黑白相間的小正方形嵌套組成,便于確定中心,糾正扭曲。 數(shù)據(jù)區(qū)記錄了具體的數(shù)據(jù)信息,糾錯信息與版本信息。 數(shù)據(jù)和糾錯碼:記錄了數(shù)據(jù)信息和相應(yīng)的糾錯碼,糾錯碼的存在使得當(dāng)二維碼的數(shù)據(jù)出現(xiàn)允許范圍內(nèi)的錯誤時,也可以正確解碼。 版本信息 :僅在版本7以上存在,記錄具體的版本信息。 格式信息 :記錄使用的掩碼和糾錯等級。 此外二維碼的外圍還留有一圈空白區(qū),主要是為了便于識別而存在。 三、數(shù)據(jù)編碼與實例針對不同的數(shù)據(jù),QR碼設(shè)計了不同的數(shù)據(jù)編碼編碼方式,我們可以根據(jù)數(shù)據(jù)的種類選擇合適的編碼方式進行編碼。 數(shù)字編碼(Numeric) :可編碼0-9,10個數(shù)字,如果需要編碼的數(shù)字的個數(shù)不是3的倍數(shù),最后剩下的1或2位數(shù)會被轉(zhuǎn)成4或7bits,其它的每3位數(shù)字會根據(jù)不同版本被編成 10,12,14bits 字符編碼(Alphanumeric) :可編碼0-9,大寫的A-Z,以及9個其他的字符(space $ % * + – . / :); 8位字節(jié)模式(8-bit Byte) :可編碼JIS X 0201的8位Latin/Kana字符集 除此之外,QR還提供了其他的編碼方式,每一個編碼方式都有其獨有的id進行標(biāo)識,這些標(biāo)識會記錄在數(shù)據(jù)區(qū)的前端,使得解碼器可以根據(jù)二維碼使用的編碼方式對數(shù)據(jù)進行解碼 圖5 一些編碼方式及其標(biāo)識 糾錯碼 二維碼存在4個級別的糾錯等級,每個糾錯級別可修正的錯誤與標(biāo)識見圖6,糾錯級別越高,可以修正的錯誤就越多,需要的糾錯碼的數(shù)量也變多,相應(yīng)的可儲存的數(shù)據(jù)就會減少,版本1的二維碼在L級別下可儲存25個字符,在H級別下只能儲存10個字符。 圖6 下面給一個01234567在版本1下用數(shù)字編碼(Numeric),選擇的糾錯級別是M的示例 第一步,將定位圖案放到二維碼中 圖7 第二步:進行數(shù)據(jù)編碼 根據(jù)圖8,版本1下,采用Numeric Mode編碼時,每三個數(shù)字需要10個bits進行標(biāo)示 圖8 012 ->0000001100 345 ->0101011001 67 ->1000011 組合起來為 0000001100 0101011001 1000011
在數(shù)據(jù)的頭尾加上一些標(biāo)準(zhǔn)要求的信息 頭 數(shù)字個數(shù) (8) = 0000001000 編碼格式 =0001 尾 終止符 =0000 組合起來為 0000001100 0101011001 1000011-> 0001 0000001000 0000001100 0101011001 1000011 0000
按8bit一組重新排列,末尾不足的補零 0001 0000001000 0000001100 0101011001 1000011 0000-> 00010000 00100000 00001100 01010110 01100001 10000000
不足最大bit的添加補齊碼(11101100 00010001),版本1 M下需要128bits 00010000 00100000 00001100 01010110 01100001 10000000-> 00010000 00100000 00001100 01010110 01100001 10000000 11101100 00010001 11101100 00010001 11101100 00010001 11101100 00010001 11101100 00010001 第三步:添加糾錯碼 糾錯碼根據(jù)數(shù)據(jù)利用RS算法來進行計算,篇幅所限,這里就不具體講解了,最終的結(jié)果如下: 00010000 00100000 00001100 01010110 01100001 10000000 11101100 00010001 11101100 00010001 11101100 00010001 11101100 00010001 11101100 00010001-> 00010000 00100000 00001100 01010110 01100001 10000000 11101100 00010001 11101100 00010001 11101100 00010001 11101100 00010001 11101100 00010001 10100101 00100100 11010100 11000001 11101101 00110110 11000111 10000111 00101100 01010101 第四步:將最終的數(shù)據(jù)編碼按順序放入二維碼中 圖9 圖10 從左下角開始,1為黑色,0為白色,按順序依次填入二維碼中 第五步:添加格式信息和進行掩碼運算 得到的圖像還需要對數(shù)據(jù)區(qū)進行掩碼運算,掩碼運算的目的是讓圖像中黑色和白色方塊分布的更加均勻一些,便于解碼 有以下幾種掩碼運算,相應(yīng)的標(biāo)識和變換方式見圖11,二維碼的左上角的坐標(biāo)為(0,0) 圖11
圖12 坐標(biāo)系和掩碼運算的圖案 這里我們選擇標(biāo)識為011的掩碼 格式信息的組成為 :糾錯標(biāo)識+掩碼標(biāo)識+BCH糾錯碼 所以前面的糾錯標(biāo)識+掩碼標(biāo)識為:00011 BCH糾錯碼計算為: 得到糾錯碼為 :011 0101 1001 格式信息為 :00011 1101011001 為了避免選擇標(biāo)識00的糾錯類別和標(biāo)識000的掩碼運算,照成格式信息為全0的數(shù)字,所得的格式信息還要與101010000010010做異或運算 000111101011001 101010000010010 XOR 101101101001011 最終的格式信息為 :101101101001011 將格式信息放入二維碼中 圖13 對加格式信息后的二維碼 進行掩碼運算 得到的最終二維碼,儲存的數(shù)據(jù)信息是01234567 圖14 整個流程見圖15 四、二維碼的安全知識雖然二維碼本身承擔(dān)的只是一些文本數(shù)據(jù),但仍會導(dǎo)致一些安全問題 1、攻擊者將一些惡意網(wǎng)站或者一些惡意代碼制作成二維碼,用戶掃描后,會自動下載一些惡意軟件,或跳轉(zhuǎn)到一些虛假網(wǎng)站給使用者造成危害, 2、二維碼內(nèi)如果包含一些可執(zhí)行的腳本,便可能導(dǎo)致xss攻擊 如 http://www./bugs/wooyun-2012-09145 3、如果將一些敏感信息不加密而直接儲存在二維碼中,便會存在信息泄露的可能,比如11年火車票上的二維碼就存在泄露使用者的身份證號碼的問題。 五、總結(jié)雖然我們在使用二維碼的時候只需要用手機一掃即可,但二維碼的編碼和解碼卻包含了很多的步驟和很多的知識,此外二維碼本身僅僅是數(shù)據(jù)的承載體,我們在使用時要針對一些敏感信息進行加密處理,防范潛在的攻擊方式
參考文獻(xiàn) 二維碼的生成細(xì)節(jié)和原理 http:///articles/10590.html#jtss-tsina QR二維碼的攻擊與防御 http://drops./tips/160 |
|
來自: 昵稱7Bw0IOvb > 《手機》