身份证号校验原理及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下载:
posted @ 2016-12-09 20:51  贰拾肆樵  阅读(543)  评论(0编辑  收藏  举报