身份证真伪的验证(C# / ASP.NET /JS代码)及算法说明
本文代码只对身份证真伪做验证,只要符合算法的身份证都为合法身份证,至于被验证的身份证的使用情况无法做出验证和判断。
一、C#(ASP.NET)代码:
#region 验证身份证是否合法
/// <summary>
/// 验证身份证是否合法
/// </summary>
/// <param name="id">要验证的身份证号码</param>
/// <returns>错误信息,为空时表示身份证合法</returns>
public static string ValidID(string id)
{
string message = string.Empty;
Regex reg = new Regex("(^\\d{15}$)|(^\\d{18}$)|(^\\d{17}(\\d|X|x)$)");//身份证正则表达式
string id_17 = string.Empty;//前17位
string resultLast = string.Empty;
if (reg.IsMatch(id))//是否符合
{
if (id.Length == 18)//18位时
{
id_17 = id.Substring(0, 17);
int[] num = new int[17];//声明数组,存放每一位数字
for (int i = 0; i < 17; i++)
{
num[i] = Convert.ToInt32(id.Substring(i, 1));//获取每位上的数字,从左往右。
}
//出生日期验证
reg = new Regex("^((((1[6-9]|[2-9]\\d)\\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-0?2-(0?[1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-))$");
/*声明变量,并获取身份证号码中的“出生日期”*/
string birth = string.Empty;
for (int i = 6, j = 0; i < 14; i++, j++)
{
birth += Convert.ToString(num[i]);
if (j == 3 || j == 5)//添加“-”使日期格式为:yyyy-MM-dd
{
birth += "-";
}
}
//验证出生日期
if (!reg.IsMatch(birth))
{
return message = "身份证号码输入有误!";
}
else if (Convert.ToDateTime(birth).AddYears(18) > Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd")) || Convert.ToDateTime(birth).AddYears(75) < Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd")))
{
return message = "身份证号码输入有误!年龄应在18到75岁之间";
}
//从左往右每一位的权:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2
int[] quan = new int[17] { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
int sum = 0;
for (int i = 0; i < 17; i++)
{
sum += num[i] * quan[i];
}
//余数(sum % 11): 0-1-2-3-4-5-6-7-8-9-10(可视为索引)
//对应值:1-0-X-9-8-7-6-5-4-3-2
string[] duiyingz = new string[11] { "1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2" };
if ((id_17 + duiyingz[sum % 11]).Equals(id.ToUpper()))
{
return message = string.Empty;
}
else
{
return message = "身份证号码输入有误!";
}
}
else//十五位身份证
{
id = id.Insert(6, "19");//给15位身份证升级,补全年份。
int[] num = new int[17];//声明数组,存放每一位数字
for (int i = 0; i < 17; i++)
{
num[i] = Convert.ToInt32(id.Substring(i, 1));//获取每位上的数字,从左往右。
}
//出生日期验证
reg = new Regex("^((((1[6-9]|[2-9]\\d)\\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-0?2-(0?[1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-))$");
/*声明变量,并获取身份证号码中的“出生日期”*/
string birth = string.Empty;
for (int i = 6, j = 0; i < 14; i++, j++)
{
birth += Convert.ToString(num[i]);
if (j == 3 || j == 5)//添加“-”使日期格式为:yyyy-MM-dd
{
birth += "-";
}
}
//验证出生日期
if (!reg.IsMatch(birth))
{
return message = "身份证号码输入有误!";
}
else if (Convert.ToDateTime(birth).AddYears(18) > Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd")) || Convert.ToDateTime(birth).AddYears(75) < Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd")))
{
return message = "身份证号码输入有误!年龄应在18到75岁之间";
}
else
{
return message = string.Empty;
}
}
}
else//不符合身份证规则(非15或18位)
{
return message = "身份证号码格式输入有误,请输入15或18位身份证号码!";
}
}
二、JS代码,这个用途就广了,这个验证可以验证身份证真伪,但没有对身份证的使用者的年龄验证
function CheckIDNumber(id){
var sid=id;
var IDReg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/; //15或18位
if(!IDReg.test(sid)){
return false;
}
if (sid.length == 18){//18位
var ysid=sid;
sid=sid.substring(0,17);
var jiaquan = new Array(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2);
var sigma=0;
for(var i = 0 ;i < 17 ;i++){
sigma += parseInt(parseInt(sid.substring(i,i+1))*jiaquan[i]);//取每一位上的数字和对应的权相乘并求和
}
var jiaoyan = new Array('1','0','X','9','8','7','6','5','4','3','2');
if (sid+jiaoyan[(sigma % 11)]==ysid){return true;}
else{return false;}
}else{//15位
return true;
}
}
附:身份证计算法则:
18位身份证标准在国家质量技术监督局于1999年7月1日实施的GB11643-1999《公民身份号码》中做了明确规定。
GB11643-1999《公民身份号码》为GB11643-1989《社会保障号码》的修订版,其中指出将原标准名称“社会保障号码”更名为“公民身份号码”,另外GB11643-1999《公民身份号码》从实施之日起代替GB11643-1989。
公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位校验码。其含义如下:
1. 地址码:表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。
2. 出生日期码:表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日分别用4位、2位、2位数字表示,之间不用分隔符。
3. 顺序码:表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
校验的计算方式:
1. 对前17位数字本体码加权求和
公式为:S = Sum(Ai * Wi), i = 0, ... , 16
其中Ai表示第i位置上的身份证号码数字值,Wi表示第i位置上的加权因子,其各位对应的值依次为: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
2. 以11对计算结果取模
Y = mod(S, 11)
3. 根据模的值得到对应的校验码
对应关系为:
Y值: 0 1 2 3 4 5 6 7 8 9 10
校验码: 1 0 X 9 8 7 6 5 4 3 2身份证号码的编排规则 身份证号码中这些数字是怎样排列的,每个数字表示什么意思呢?下面就让我们一起来探索其中的规律吧!新的身份证号码是由18位数字组成的,它们分别表示:
(1)前1、2位数字表示:所在省份的代码;
(2)第3、4位数字表示:所在城市的代码;
(3)第5、6位数字表示:所在区县的代码;
(4)第7~14位数字表示:出生年、月、日;
(5)第15、16位数字表示:所在地的派出所的代码;
(6)第17位数字表示性别:奇数表示男性,偶数表示女性;
(7)第18位数字是校检码:也有的说是个人信息码,一般是随计算机的随机产生,
用来检验身份证的正确性。校检码为0~9的数字和x表示。
以上说明参考文献:http://wenku.baidu.com/view/13eab34ac850ad02de80414e.html
身份证真伪的验证(C# / ASP.NET /JS代码)及算法说明相关推荐
- JavaScript 身份证号有效验证详解及实例代码
这篇文章主要介绍了JavaScript 身份证号有效验证详解及实例代码的相关资料,需要的朋友可以参考下 JavaScript验证身份证号 1 2 3 4 5 6 7 8 9 10 11 12 13 1 ...
- python验证身份证真伪_验证身份证的真伪,博客系统、个人博客、PHP、Linux、MySQL、python、前端技术、WEB知识...
摘要:验证身份证的真伪<?php functionisIdCard($number){ $sigma=''; //加权因子 $wi=array(7,9,10,5,8,4,2,1,6,3,7,9, ...
- 比较正宗的验证邮箱的正则表达式js代码详解
来源:http://www.jb51.net/article/31182.htm 邮箱正则最正宗的一条正则语句是^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a- ...
- 经典asp、js代码
1. οncοntextmenu="window.event.returnvalue=false" 将彻底屏蔽鼠标右键 <table border οncοntextmenu ...
- php验证电话号码是否合法,js代码验证手机号码和电话号码是否合法_javascript技巧...
function Checkreg(){ //验证电话号码手机号码,包含 , 号段 if(document.form.phone.value==""&&docume ...
- Java身份证号码严格验证(第18位校验码算法实现)
/*** 身份证号码的格式:610821-20061222-612-X 由18位数字组成:前6位为地址码,第7至14位为出生日期码,第15至17位为顺序码,* 第18位为校验码.检验码分别是0-10共 ...
- asp.net 用户注册怎么判断用户名是否重复 ajax,AJAX_asp.net结合Ajax验证用户名是否存在的代码,1, 使用JavaScript js文件,验证 - phpStudy...
asp.net结合Ajax验证用户名是否存在的代码 1, 使用JavaScript js文件,验证用户名是否存在 复制代码 代码如下: var ajax = function(option) { va ...
- js实现完美身份证号有效性验证+身份证与姓名匹配
/* 根据[中华人民共和国国家标准 GB 11643-1999]中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成.排列顺序从左至右依次为:六位数字地址码,八位 ...
- 【JS】Js二代身份证号码正则验证
Js二代身份证号码正则验证代码: export function checkIDCard(idcode) {// 加权因子var weight_factor = [7,9,10,5,8,4,2,1,6 ...
- js身份证号有效性验证
js身份证号有效性验证 1.简述 最近做的系统有用到实名验证的,起初对于用户身份证号只是简单地使用正则表达式进行验证, 很多无效的身份证号就成了漏网之鱼. 导致后台存表里很多无效的身份证号,随便输入用 ...
最新文章
- bootstrap validator 出现Maximum call stack size exceeded
- Java 异常处理中对于 finally 的一些思考
- js点击图片查看大图,并可以拖动,且滚动滑轮放大缩小
- 深入理解C# 3.x的新特性(2):Extension Method[下篇]
- Atitit 模板引擎总结 v4 saa 目录 1. 模板引擎	1 1.1. 构成渲染引擎+指令系统	1 1.2. 模板语法mustache语法 es6 el语法	1 2. 常见模板步骤	1 2.
- 「ds」网络操作系统和分布式操作系统之间的区别
- SAP MM 发货到成本中心场景下的批次确定
- VOIP Codec 三剑客之 ISAC/ILBC -- ISAC (3) High Band Encode 模块
- 多个考拉海购的商品主图如何一键批量保存
- C语言:fflush()的用法以及缓冲区的概念
- 币种对应的转换因子(处理日元台币…
- ps4手柄驱动linux,Arduino和单片机区别,及Arduino入门教程
- Vue中使用友盟CNZZ事件统计
- word中一个表格拆分成两个单独的表格
- Window管理右键菜单
- vue 环信im 发送图片、接收图片
- 微信小程序switch样式调整
- 浅谈云时代如何解决身份管理
- Eclipse Helios(3.6.2)下载地址
- 十进制数怎样转成十六进制数?