ID驗證系列|身分證字號驗證 - HackMD

文章推薦指數: 80 %
投票人數:10人

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 中華民國身分證

##編號規則 目前現行的身分證字號一共有**10碼**,包括起首的大寫的英文字母與接續的九個阿拉伯數字(如:A123456789),大抵可以將身分證字號分成五區:**區域碼**、**性別碼**、**身分碼**、**流水碼**跟**檢核碼**。

流水碼 阿拉伯數字
區域碼 性別碼 身分碼 檢核碼
A-Z 男:1
女:2
其他:0-5
取得國籍之外國人:6
無戶籍國民:7
港澳居民:8
大陸地區人民:9
阿拉伯數字
其中首碼的縣市代碼是以報戶口的地區來區分的、而性別代碼則是指首位數字,其中男性為1、女性為2,最後第三碼是身分碼,其中0-5是保留給國人,6-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 是說如果不要顯示log,RegularExpression可以涵蓋前半段的檢查: ```javascript= functionverifyId(id){ id=id.trim(); verification=id.match("^[A-Z][12]\\d{8}$") if(!verification){ 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


請為這篇文章評分?