身份證號校驗原理及JavaScript實現


      在網站中,總有各種各樣的表單,用戶使用表單來向服務器發送數據,進行交互。 然而,代代相傳的經驗是,永遠不要信任用戶的輸入,一定要對數據進行驗證。如果使用不經驗證的表單,輕則會有大量無效提交進入服務器,嚴重影響網站運行;重則招致XSS攻擊~ 所以對輸入進行驗證是必要的。而爲了減輕服務器的壓力,除了密碼正誤等需要向數據庫交互才能驗證的輸入之外,絕大部分輸入的驗證都應當在前端進行。其中,身份證號的校驗就是非常常見的一個。
     
      身份證號是中華人民共和國公民的身份編號,有15位(第一代身份證)和18位兩種。第一代身份證所採用的15位身份證號,由於沒有校驗位,故無法進行驗證,這裏我們討論現今絕大多數人所使用的18位身份證號的驗證方法。15位身份證號也可以通過下面的原理轉換成18位身份證號,這裏就不列出方法了~   18位身份證號碼的構成如下:
XXXXXXXXXXXXXXXXXX
第1-6位:1-2位表示省級行政區代碼;3-4位表示地級行政區代碼;5-6位表示縣級行政區代碼
第7-14位:出生年月日
第15-17位:順序碼,其中奇數分配給男性,偶數分配給女性
第18位:校驗碼

      我們對身份證號的正確性進行驗證,就是利用最後一位校驗位來進行的~而校驗位的算法是這樣的:
             公民身份證號碼中各個位的數字應滿足以下公式的校驗:
 
              
               其中:i表示身份證號低位到高位的位序號
                         ai表示該位置上的號碼字符值
                         Wi表示該位置上的加權因子,其計算方法: 。各個位的Wi值可直接引用下表:
i 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
Wi 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 1

      根據上面的公式,可以推算出校驗位與其他位校驗關係:

      對於沒學過數論的同學(其實我也是現學的),再說一下“同餘“的概念:給定一個正整數m,如果兩個整數a和b滿足a-b能被m整除,即m|(a-b),那麼就稱整數a與b對模m同餘,記作a≡b(mod m)。

      綜上:最終推導出驗證身份證號所用的表達式:
       
      若上方表達式成立,則該身份證號有效。


     下面是在JavaScript中的方法實現:
function checkId(){
	var code = /* 這裏是要校驗的身份證號 字符串或者數字都可以 */;
	if(code.length == 18){
		if(checkMod(code) == true){
			alert("正確");
		}
		else alert("輸入的身份證號不正確");
	}
	else alert("輸入的身份證號格式錯誤。");
    }

    function checkMod(code){
	var arr = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2],//從第18位到第2位的Wi
		proof = code.charAt(17).toUpperCase() == "X" ? 10 : parseInt(code.charAt(17)),//得到輸入身份證號的最後一位並將X轉換爲10
		sum = 0;//前十七位的校驗和

	for(var i = 0;i < arr.length;i++){
		sum += code.charAt(i) * arr[i];
	}
	return (proof + sum - 1) % 11 == 0;
    }
完整Demo下載:
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章