QR Code是什麼?髒污也能讀取的原理
QR Code是把黑白小方塊排成縱橫的格子,用0和1表示文字與數字的條碼。它在1994年為了管理汽車零件,誕生於DENSO的開發部門(現在的DENSO WAVE)。資料中加了「修復損壞處用的備用資訊」,所以就算一部分髒了,也能還原讀取。不過,讀得到和安全是兩回事,打開之前先確認連結的去處很重要。
這篇文章可以了解
- QR Code誕生的原因,以及規格的概要
- 3個大方塊等固定圖案的作用
- 髒了也能讀的「錯誤更正」原理
- 手機相機讀取QR Code的流程
- 如何保護自己,避開利用QR Code的詐騙
先備知識:二進位(只用0和1表示數字的方法)。在「電腦怎麼用0和1計算?」中有說明。
生活中的例子
在商店用手機付款、火車或飛機的電子票、餐廳點餐、Wi-Fi的設定。這些都只要把手機相機對準,就能讀入很長的號碼或網頁的網址。
QR Code的內容,只是一串文字或數字。如果內容是網頁的網址,手機就會試著打開那個網頁。如果是付款用的號碼,就會進入付款畫面。決定要做什麼的不是QR Code,而是讀取它的App。
QR Code從哪裡來
QR Code在1994年,誕生於汽車零件製造商DENSO的開發部門。這個部門在2001年獨立出來,成為現在的DENSO WAVE。帶領開發的是原昌宏先生,團隊從2個人開始。
當時的工廠,在附於零件箱上的標籤(看板)使用條碼。但條碼能放的資訊少,1件物品必須貼上好幾條來讀取。因此,大家需要一種能快速讀取大量資訊、又不怕髒污的條碼。
QR是Quick Response(快速回應)的縮寫,名稱代表以快速讀取為目標。另外,「QR Code」是DENSO WAVE的註冊商標。另一方面,該公司宣布,對於符合規格的QR Code,不行使所持有的專利權。因此,任何人都不必取得許可,就能製作和使用QR Code。
QR Code的規則在1997年成為自動辨識產業團體AIM的規格。1999年成為日本的JIS X 0510,2000年成為國際標準ISO/IEC 18004。ISO/IEC 18004之後也持續修訂,截至2026年10月的最新版是2024年版。
原理1:黑白方塊代表0和1
把QR Code放大,會看到同樣大小的小方塊,像方格紙一樣排列。這1格稱為模組。基本上,黑色模組代表1,白色模組代表0。
縱橫排列的模組數量,決定QR Code的大小。這種大小的級別稱為版本。最小的版本1是縱橫各21個。版本每升1級,縱橫各增加4個,最大的版本40是177×177個。
能放的量,會隨放入的文字種類而改變。數字只有0〜9共10種,所以3位(1000種)可以合起來用10位元(1024種)表示。英文字母或漢字種類多,1個字就要用較多位元。最大的版本40能放的量如下(錯誤更正最弱的等級L時。等級稍後說明)。
| 放入的文字 | 最多的字數 |
|---|---|
| 只有數字 | 7,089位 |
| 英數字(數字、大寫英文字母、部分符號) | 4,296字 |
| 位元組(8位元的值) | 2,953個 |
| 漢字 | 1,817字 |
以日文為例,可以用漢字專用的寫法(漢字模式)放入,也可以當作位元組的排列放入。漢字模式使用的是Shift JIS這種日文字元表的編號。讀取端如果弄錯是用哪一種字元表寫的,就會出現亂碼。
原理2:固定的圖案是「讀取用的記號」
QR Code的圖案並不全是資料。在固定的位置,放有給讀取機器用的記號。下圖中只有⑤是承載資料的部分,其他都是記號。
- ① 定位圖案:位於3個角落的大方塊。它告訴讀取端,條碼在哪裡、朝哪個方向、有多大。英文稱為finder pattern。
- ② 時序圖案:連接大方塊、黑白交替的一列。它像尺一樣,用來量出1格的間隔。
- ③ 校正圖案:小方塊,出現在版本2以上。它是修正斜拍時變形的線索。版本越大數量越多,版本40有46個。
- ④ 格式資訊:記錄錯誤更正的強度,以及稍後說明的「遮罩」編號。因為是讀取不可缺少的部分,同樣的內容放在2個地方。
- ⑥ 空白區(靜區,quiet zone):四周需要4個模組寬、什麼都沒有的帶狀區域。這是為了把條碼和周圍的文字或圖畫區分開來。
版本7以上,還會加上記錄版本編號的欄位。圖中省略。
3個大方塊是「1:1:3:1:1」的理由
定位圖案是黑框、白框、黑芯疊在一起的形狀。沿著通過中心的線看,黑、白、黑、白、黑的寬度是1:1:3:1:1。不論橫向、縱向或斜向,只要通過中心,這個比例都不變。
因此,即使條碼轉了方向,讀取端只要尋找「這種寬度比的排列」,就能找到記號。根據DENSO WAVE的說明,開發團隊調查了傳單、雜誌和紙箱上的印刷。然後選出在印刷品中最不容易出現的比例1:1:3:1:1。這是為了即使周圍有照片或文字,也不容易認錯記號。
大方塊有3個,是因為有3個就能確定唯一的方向。從沒有方塊的角落在哪裡,就知道條碼的右下角。就算拍到上下顛倒,也能轉回正確的方向讀取。
原理3:髒了也能讀的「錯誤更正」
QR Code除了資料以外,還加上了修復損壞部分用的備用資訊。即使因髒污或刮傷而讀錯模組,也能從備用資訊重新算出原本的資料。這種機制稱為錯誤更正。
「CRC是什麼?」中說明的CRC,是發現「有」錯誤的機制。如果是通訊,發現後請對方重送就好。但是,印刷出來的QR Code,沒有可以請求重送的對象。所以要使用只靠接收端就能修正的方法。這種方法稱為前向錯誤更正(FEC)。
QR Code把資料分成每8位元一塊來處理。這種塊稱為碼字。備用的碼字,是從資料的碼字用固定的計算產生的。
這種計算方法,就是里德和所羅門在1960年發表的里德-所羅門碼。除了QR Code,CD和DVD也用它來修正刮傷造成的錯誤。能修正錯誤的編碼統稱為錯誤更正碼(ECC),里德-所羅門碼是其中的代表之一。
4種強度(錯誤更正等級)
製作QR Code的人,可以從4個等級中,選擇要加多少備用資訊。DENSO WAVE列出各等級能修正的量如下。
| 等級 | 可還原的量(以碼字數計) |
|---|---|
| L | 約7% |
| M | 約15% |
| Q | 約25% |
| H | 約30% |
這個比例是以碼字的數量計算,而不是紙面的面積。1處髒污也可能跨到2個碼字,該公司也提醒「依髒污的狀況,有時無法還原」。另外,①〜④的記號如果髒了,即使資料完好,也可能讀不出來。
用文字說明里德-所羅門碼
里德-所羅門碼會從資料產生「符合固定規則的備用值」。接收端讓剩下的值符合規則,反推出損壞的值。下面不用數學式,用一個比喻來想想看。
在比喻中,知道消失的位置時,1個備用值就能修正1個。不知道哪裡變了時,還得找出「哪個是錯的」,所以需要2個備用值。QR Code各等級的比例,是以不知道位置的錯誤來計算的。因此,能修正約30%的等級H,全體有一半以上是備用資訊。
備用資訊越多,越不怕髒污,但同樣大小能放的資料就越少。例如版本1能放的數字,等級L是41位,等級H是17位。根據DENSO WAVE的說明,在工廠等容易髒污的地方,有時會選擇Q或H。
原理4:用遮罩讓圖案平均
資料直接排列,有時會出現整片全白或全黑的大區塊。區塊太大,就不容易數出格子的邊界。也可能碰巧出現類似定位圖案的圖案。
因此,要在資料部分疊上固定的圖案,把黑白互換。這個圖案稱為遮罩。疊的方法是XOR這種計算:2個相同就是0(白),不同就是1(黑)。
只有遮罩的黑色處,資料的黑白會反轉。讀取端再疊一次同樣的遮罩,反轉就會抵消,回到原本的樣子。XOR的計算,也可以用位元運算計算工具試試看。
遮罩的圖案有8種。製作端會8種全部試過,用分數挑出大區塊和容易混淆的圖案較少的那一種。用了哪一種,會寫在④的格式資訊裡。
手機讀取的流程
從把相機對準到出現文字為止,手機內部會依序進行以下的事。這裡省略細節,只說明流程。
- 拍照:相機的零件(影像感測器)把光的亮度,變成每個點的數字(「影像感測器是什麼?」)
- 分成黑白:決定亮度的分界,把每個點分成白或黑
- 尋找3個方塊:尋找1:1:3:1:1的排列,得知條碼的位置、方向和大小
- 修正變形:從斜角拍攝,正方形會拍成梯形。從方塊和校正圖案的位置,用計算修正成從正面看的形狀
- 讀取格子:用時序圖案量出格子的間隔,逐格讀成0或1
- 讀取格式資訊:得知錯誤更正的等級和遮罩的編號
- 移除遮罩:疊上同樣的遮罩,還原成原本的資料
- 修正錯誤:用里德-所羅門碼,修正因髒污而變掉的碼字
- 還原成文字:讀取寫法種類(數字、英數字、位元組、漢字)的標記和字數,還原成文字
在手機上,這些步驟一瞬間就完成。iPhone的相機等,會先在畫面上顯示讀到的連結,點一下才會打開。這個「打開前的一瞬間」,就是防範接下來要說明的詐騙的重要時刻。
小心利用QR Code的詐騙
QR Code的內容,人的眼睛讀不出來。有些詐騙就利用這個性質,把人引到假網站。假冒真實公司、盜取密碼等資料的手法,稱為網路釣魚。利用QR Code的手法,英文也稱為「quishing」。
以日本為例,日本的防範網路釣魚協議會在2024年8月發出提醒。內容是用假冒信用卡公司的電子郵件中的QR Code,引導到假網站的手法。日本的IPA(資訊處理推進機構)也說明,曾在看板、傳單和郵寄物上發現有害的QR Code。美國FBI在2022年1月,警告了真的QR Code被換成假QR Code的手法。
整理各機構的呼籲,重點如下。
- 打開之前,先確認畫面上顯示的URL(網址)。小心只差1個字的假名稱
- 不要從電子郵件或簡訊(SMS)收到的QR Code登入。從官方App,或事先存好的書籤打開
- 街上張貼的QR Code,要看看上面有沒有被貼上另一張貼紙
- 讀取後的頁面如果要求輸入密碼或卡號,先停下來
不過,只看URL,有時也無法斷定是真的。日本的防範網路釣魚協議會也表示,只靠確認URL,無法完全防止受害。養成從官方App打開的習慣,再搭配多因素驗證(密碼之外再多一種確認的方法),才比較可靠。假網站和鎖頭圖示的關係,在「HTTPS是什麼?」中說明。
QR Code的同類
Micro QR Code是只有1個定位圖案的小型版本。空白區只要2個模組寬,所以可以印在小零件等狹窄的地方。最大的M4也只有17×17模組,最多只能放35位數字。
rMQR Code是長方形的QR Code。它由DENSO WAVE開發,2022年5月以ISO/IEC 23941成為國際標準。它也能印在細長的地方,最大尺寸(17×139模組)最多可放361位數字。
常見的誤解
誤解:大家一直製作下去,QR Code總有一天會不夠用
實際上,QR Code不是像電話號碼那樣分配出去的號碼。它是把內容的文字,按照固定規則變成圖案。即使是最小的版本1、等級L,也能放17個位元組。1個位元組有256種,所以組合超過10的40次方種。同樣內容的QR Code不管有幾張,都沒有關係。
誤解:中間的標誌(logo),是放在QR Code預留的「logo專用位置」
實際上,QR Code沒有logo專用的位置。被logo遮住的模組,每次讀取時都靠錯誤更正來修復。不過,能修正的量有限。如果遮住3個大方塊或格式資訊,即使資料完好也讀不出來。DENSO WAVE也提醒,在條碼上疊加文字或圖畫,可能會讀不出來。要放logo,基本做法是提高錯誤更正等級,並實際用幾台裝置確認能否讀取。
誤解:能順利讀取的QR Code,內容也很安全
實際上,「讀得到」只代表從圖案正確取出了文字。錯誤更正保護的,是髒污和刮傷造成的錯誤,而不是製作者的惡意。放入假網站URL的QR Code,也能清楚讀出來。安全與否,要在讀取之後,從要打開的去處來判斷。
從數字來看
| 數字 | 代表什麼 |
|---|---|
| 1994年 | QR Code開發的年份 |
| 2024年 | 現行國際標準 ISO/IEC 18004 的版本(截至2026年10月) |
| 21×21 〜 177×177 | 從版本1到版本40的縱橫模組數 |
| 7,089位 | 版本40、等級L能放的數字最多位數 |
| 約7〜30% | 錯誤更正等級L到H可還原的碼字,占全體的比例 |
進一步學習
- 名詞的詳細解說:前向錯誤更正(FEC)/ECC(錯誤更正碼)/漢明碼/CRC(循環冗餘檢查)
- 用數字試試看:漢明碼計算工具(修正錯誤最簡單的編碼)/CRC 計算工具(發現錯誤的編碼)
- 相關的解說:「CRC是什麼?」/「影像感測器是什麼?」/「密碼為什麼會被破解?」