本文代码只对身份证真伪做验证,只要符合算法的身份证都为合法身份证,至于被验证的身份证的使用情况无法做出验证和判断。

一、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代码)及算法说明相关推荐

  1. JavaScript 身份证号有效验证详解及实例代码

    这篇文章主要介绍了JavaScript 身份证号有效验证详解及实例代码的相关资料,需要的朋友可以参考下 JavaScript验证身份证号 1 2 3 4 5 6 7 8 9 10 11 12 13 1 ...

  2. python验证身份证真伪_验证身份证的真伪,博客系统、个人博客、PHP、Linux、MySQL、python、前端技术、WEB知识...

    摘要:验证身份证的真伪<?php functionisIdCard($number){ $sigma=''; //加权因子 $wi=array(7,9,10,5,8,4,2,1,6,3,7,9, ...

  3. 比较正宗的验证邮箱的正则表达式js代码详解

    来源:http://www.jb51.net/article/31182.htm 邮箱正则最正宗的一条正则语句是^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a- ...

  4. 经典asp、js代码

    1. οncοntextmenu="window.event.returnvalue=false" 将彻底屏蔽鼠标右键 <table border οncοntextmenu ...

  5. php验证电话号码是否合法,js代码验证手机号码和电话号码是否合法_javascript技巧...

    function Checkreg(){ //验证电话号码手机号码,包含 , 号段 if(document.form.phone.value==""&&docume ...

  6. Java身份证号码严格验证(第18位校验码算法实现)

    /*** 身份证号码的格式:610821-20061222-612-X 由18位数字组成:前6位为地址码,第7至14位为出生日期码,第15至17位为顺序码,* 第18位为校验码.检验码分别是0-10共 ...

  7. asp.net 用户注册怎么判断用户名是否重复 ajax,AJAX_asp.net结合Ajax验证用户名是否存在的代码,1, 使用JavaScript js文件,验证 - phpStudy...

    asp.net结合Ajax验证用户名是否存在的代码 1, 使用JavaScript js文件,验证用户名是否存在 复制代码 代码如下: var ajax = function(option) { va ...

  8. js实现完美身份证号有效性验证+身份证与姓名匹配

    /* 根据[中华人民共和国国家标准 GB 11643-1999]中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成.排列顺序从左至右依次为:六位数字地址码,八位 ...

  9. 【JS】Js二代身份证号码正则验证

    Js二代身份证号码正则验证代码: export function checkIDCard(idcode) {// 加权因子var weight_factor = [7,9,10,5,8,4,2,1,6 ...

  10. js身份证号有效性验证

    js身份证号有效性验证 1.简述 最近做的系统有用到实名验证的,起初对于用户身份证号只是简单地使用正则表达式进行验证, 很多无效的身份证号就成了漏网之鱼. 导致后台存表里很多无效的身份证号,随便输入用 ...

最新文章

  1. bootstrap validator 出现Maximum call stack size exceeded
  2. Java 异常处理中对于 finally 的一些思考
  3. js点击图片查看大图,并可以拖动,且滚动滑轮放大缩小
  4. 深入理解C# 3.x的新特性(2):Extension Method[下篇]
  5. Atitit 模板引擎总结 v4 saa 目录 1. 模板引擎 1 1.1. 构成渲染引擎+指令系统 1 1.2. 模板语法mustache语法 es6 el语法 1 2. 常见模板步骤 1 2.
  6. 「ds」网络操作系统和分布式操作系统之间的区别
  7. SAP MM 发货到成本中心场景下的批次确定
  8. VOIP Codec 三剑客之 ISAC/ILBC -- ISAC (3) High Band Encode 模块
  9. 多个考拉海购的商品主图如何一键批量保存
  10. C语言:fflush()的用法以及缓冲区的概念
  11. 币种对应的转换因子(处理日元台币…
  12. ps4手柄驱动linux,Arduino和单片机区别,及Arduino入门教程
  13. Vue中使用友盟CNZZ事件统计
  14. word中一个表格拆分成两个单独的表格
  15. Window管理右键菜单
  16. vue 环信im 发送图片、接收图片
  17. 微信小程序switch样式调整
  18. 浅谈云时代如何解决身份管理
  19. Eclipse Helios(3.6.2)下载地址
  20. 十进制数怎样转成十六进制数?

热门文章

  1. 国家统计局长称今年经济增速可能超去年
  2. 已知视频码率、视频时长,怎么计算视频文件大小
  3. 2019CBA全明星周末举行正赛 南方明星队获胜
  4. docker常用命令network篇
  5. 汇编语言之DOSBox
  6. git冲突解决和放弃本地操作
  7. zblog自动采集伪原创站群文章更新器
  8. Gitlab+猪齿鱼 实现自动化部署
  9. 基于web的网页问卷调查设计_Python3菜鸟教程丨基于Web模块的轻量级接口设计基础...
  10. 春季养肝注意三个行为,做对了一年少生病