zoukankan      html  css  js  c++  java
  • 身份证号校验原理及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下载:
  • 相关阅读:
    struts2 标签为简单标签
    html a标签链接使用action 参数传递中文乱码
    html 字体加粗
    Unity3D学习笔记(一):Unity简介、游戏物体、组件和生命周期函数
    Unity3D学习笔记(一):Unity3D简介 111
    C#学习笔记(二十):C#总结和月考讲解
    C#学习笔记(十九):字典
    C#学习笔记(十八):数据结构和泛型
    C#学习笔记(十七):委托、事件、观察者模式、匿名委托和lambert表达式
    C#学习笔记(十六):索引器和重载运算符
  • 原文地址:https://www.cnblogs.com/zhuwq585/p/6390546.html
Copyright © 2011-2022 走看看