ID驗證系列|身分證字號驗證 - HackMD
文章推薦指數: 80 %
ID驗證系列|身分證字號驗證###### tags: | `先備知識` | `編碼規則` `Javascript` `regexp` `臺灣ID驗證系列` | `Published` {%
Published
LinkedwithGitHub
Like4
Bookmark
Subscribe
---
title:ID驗證系列|身分證字號驗證
date:2021-03-10
is_modified:true
disqus:cynthiahackmd
categories:
-"先備知識"
tags:
-"先備知識"
-編碼規則
-Javascript
-regexp
-臺灣ID驗證系列
-"Published"
---
#ID驗證系列|身分證字號驗證
######tags:|`先備知識`|`編碼規則``Javascript``regexp``臺灣ID驗證系列`|`Published`
{%hackmd@CynthiaChuang/Github-Page-Theme%}
最近看到一則[有趣的新聞](https://www.ctwant.com/article/61090),原來身分字號`A123456789`真有其人阿!決定來稍微了解一下,身分證字號是怎產生出來的,順便寫寫身分證字號檢查器...原本想寫產生器的,但想想還是算了XD
區域碼 | 性別碼 | 身分碼 | 檢核碼 |
---|---|---|---|
A-Z | 男:1 女:2 |
其他:0-5 取得國籍之外國人:6 無戶籍國民:7 港澳居民:8 大陸地區人民:9 |
阿拉伯數字 |
關於第三碼的**身分碼**,在我2020-08第一次寫這篇的時候,我並沒有注意到身分碼的資料,但在今天為了寫[《【臺灣ID驗證系列】居留證驗證》]( https://hackmd.io/@CynthiaChuang/Check-Resident-Certificate-Number)在[查資料](http://www.academic.fcu.edu.tw/wSite/public/Attachment/f1582594331972.pdf)的時候,發現了這東西。
不過再細查資料,這條規則是在內政部92年4月24日台內戶字第0920063929號函規定就被定下了,所以應該是我上次資料漏看了!?
整體來說,一個完整的身份證字號如下:
區域碼 | 性別碼 | 身分碼 | 檢核碼 | ||||||
---|---|---|---|---|---|---|---|---|---|
A | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
在進行編碼檢查時,會將縣市代碼轉換成相對應的數值,如A就會被轉換成`10`: |A|B|C|D|E|F|G|H|I|J| |---|---|---|---|---|---|---|---|---|---| |10|11|12|13|14|15|16|17|34|18| |K|L|M|N|O|P|Q|R|S|T| |---|---|---|---|---|---|---|---|---|---| |19|20|21|22|35|23|24|25|26|27| |U|V|W|X|Y|Z| |---|---|---|---|---|---| |28|29|32|30|31|33|
將轉換完成的數值,乘上相對應的權重後進行加總: |Index|$n_0$|$n_1$|$n_2$|$n_3$|$n_4$|$n_5$|$n_6$|$n_7$|$n_8$|$n_9$|$n_{10}$| |---|---|---|---|---|---|---|---|---|---|---|---| |權重|1|9|8|7|6|5|4|3|2|1|1| 若總和為**10的倍數**,即為有效的驗證碼。
若改寫成數學判斷式: $$ (n_0\times1+n_1\times9+n_2\times8+n_3\times7+n_4\times6+n_5\times5+n_6\times4+n_7\times3+n_8\times2+n_9\times1+n_{10}\times1)\%10=0 $$
將`A123456789`轉換成`10123456789`後套入公式如下: $$ \begin{aligned} &(1\times1+0\times9+1\times8+2\times7+3\times6+4\times5+5\times4+6\times3+7\times2+8\times1+9\times1)\%10\\ &=(1+0+8+14+18+20+20+18+14+8+9)\%10\\ &=130\%10\\ &=0 \end{aligned} $$ 餘數為0,表有效的ID。
##程式碼 有點久沒寫js了,順便寫寫js練練手好了。
把上面的規則寫成程式,如下: ```javascript= functionverifyId(id){ id=id.trim(); if(id.length!=10){ console.log("Fail,長度不正確"); returnfalse } letcountyCode=id.charCodeAt(0); if(countyCode<65|countyCode>90){ console.log("Fail,字首英文代號,縣市不正確"); returnfalse } letgenderCode=id.charCodeAt(1); if(genderCode!=49&&genderCode!=50){ console.log("Fail,性別代碼不正確"); returnfalse } letserialCode=id.slice(2) for(letiinserialCode){ letc=serialCode.charCodeAt(i); if(c<48|c>57){ console.log("Fail,數字區出現非數字字元"); returnfalse } } letconver="ABCDEFGHJKLMNPQRSTUVXYWZIO" letweights=[1,9,8,7,6,5,4,3,2,1,1] id=String(conver.indexOf(id[0])+10)+id.slice(1); checkSum=0 for(leti=0;i
>**本文作者**:辛西亞.Cynthia >**本文連結**:[辛西亞的技能樹](https://cynthiachuang.github.io/CheckUID)/[hackmd版本](https://hackmd.io/@CynthiaChuang/CheckUID) >**版權聲明**:部落格中所有文章,均採用[姓名標示-非商業性-相同方式分享4.0國際](https://creativecommons.org/licenses/by-nc-sa/4.0/deed.en)(CCBY-NC-SA4.0)許可協議。
轉載請標明作者、連結與出處! 4 × Signin Email Password Forgotpassword or Byclickingbelow,youagreetoourtermsofservice. SigninviaFacebook SigninviaTwitter SigninviaGitHub SigninviaDropbox NewtoHackMD?Signup
延伸文章資訊
- 1線上身份證字號產生器/檢查器
上面產生出來的結果可以雙擊後將資料讀出, 亦可按下檢查進行檢查確認(應該不會有錯的啦!!) 本身份證字號產生器用於測試身份證字號檢查公式及反推的算法, 請勿用於違法用途, ...
- 2檢查身分證字號
檢查身分證字號 ... 轉換後的身分證字號(共11位數字)每一位數均有固定的權重(Weight),由左往右依序為『1 9 8 7 6 5 4 3 2 1 1』。判斷身分證字號是否正確的方法為: ...
- 3身份證字號規則
- 4身份證字號驗證範例表單
ID.value ) ) window.alert( "身份證字號錯誤!" ); if ( ! ... 0 ) return false; return true; } </SCRIPT> <H...
- 5國民身分證領補換資料查詢作業 - 內政部戶政司
圖形驗證所顯示之驗證碼,輸入字元。 五、如輸入資料錯誤達2次,當日無法查詢。