`
kevin_wanwei
  • 浏览: 117683 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

新旧身份证合法性验证及验证算法

阅读更多

1.         中国公民身份证常识:

我国现行使用公民身份证号码有两种尊循两个国家标准,〖GB 11643-1989〗和〖GB 11643-1999〗。

GB 11643-1989〗中规定的是15位身份证号码:排列顺序从左至右依次为:六位数字地址码,六位数字出生日期码,三位数字顺序码,其中出生日期码不包含世纪数。

 

6行政区划分代码

6位出生日期

3位顺序

 

       GB 11643-1999〗中规定的是18位身份证号码:公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。

 

6位行政区划分代码

6位出生日期

3位顺序码

1位校验码

 

       行政区划分代码:表示编码对象常住户口所在县(市、旗、区)的行政区划代码。

       行政区划分代码国家标准GB T 2260-1999

       出生日期码:表示编码对象出生的年、月、日,其中年份用四位数字表示,年、月、日之间不用分隔符。

       顺序码:表示同一地址码所标识的区域范围内,对同年、同月、同日出生的人员编定的顺序号。顺序码的奇数分给男性,偶数分给女性。

    校验码:是根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。

ISO 7064:1983.MOD 11-2校验码计算法

 

按照中华人民共和国国家标准GB11643-1999规定中华人民共和国公民身份号码校验码的计算方法即为ISO 7064:1983.MOD 11-2校验码计算法。

假设某一17位数字是

17位数字 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7
加权因子 2 4 8 5 10 9 7 3 6 1 2 4 8 5 10 9 7
  1. 计算17位数字各位数字与对应的加权因子的乘积的和S:1×2+2×4+3×8+4×5+5×10+6×9+7×7+8×3+9×6+0×1+1×2+2×4+3×8+4×5+5×10+6×9+7×7=492;
  2. 计算S÷11的余数T:492 mod 11=8;
  3. 计算(12-T)÷11的余数R,如果R=10,校验码为字母“X”;如果R≠10,校验码为数字“R”:(12-8)mod 11=4。

该17位数字的校验码就是4,聚合在一为123456789012345674

package id_card;

import string_util.StringUtil;

/**
 * 身份证号码验证小程序
 * @author Kevin
 * 2010-3-28
 */
public class IdCardUtil {
	/** 旧身份证号码位数(完全有数字组成) */
	public static final int OLD_IDCARD_LEN=15;
	/** 新身份证号码位数 */
	public static final int NEW_IDCARD_LEN=18;
	/** 存放位权值数组 */
	private static int[] wi=new int[17];
    /**最小行政区划分代码*/
    private final static int MINCODE = 110000;
    /**最大行政区划分代码*/
    private final static int MAXCODE = 820000;
    /** 求模参数 */
    private final static int MODE=11;
    /** 新身份证年份标记 */
    private final static String YEAR_FLAG="19";
    /**
     * 设置位权值
     */
    private static void setWiValue(){
    	for(int i=0;i<wi.length;i++){
    		int k=(int)Math.pow(2, (wi.length-i));
    		wi[i]=k%MODE;
    	}
    }
    /**
     * 依据新身份证号码前17为数字,得到最后一位验证码
     * @param checkString
     * @return
     */
    private static String getCheckCode(String checkString){
    	int sum=0;
    	setWiValue();//设置位权值
    	for(int i=0;i<checkString.length();i++){
    		int k=StringUtil.convertInteger(String.valueOf(checkString.charAt(i)))*wi[i];
    		sum+=k;
    	}
    	int num=(12-(sum%MODE))%MODE;
    	if(num==10){
    		return "X";
    	}else{
    		return String.valueOf(num);
    	}
    	
    }
    /**
     * 验证身份证号码行政区划分代码是否有效
     * @param idCard
     * @return
     */
    public static boolean isValidateCantonCode(String idCard) throws Exception{
    	String cantonCode=idCard.substring(0,6);
    	int code=StringUtil.convertInteger(cantonCode);
    	if(code>=MINCODE && code<=MAXCODE){
    		return true;
    	}
    	return false;
    }
    /**
     * 验证新身份证最后一位是否有效
     * @param lastLetter
     * @return
     */
	private static boolean isValidateLastCode(String lastCode){
		//是否是数字、'x'或'X'
		if(StringUtil.isCompleteNumberString(lastCode)||lastCode.equalsIgnoreCase("x")){
			return true;
		}
		return false;
	}
    /**
     * 验证身份证是否有效
     * @param idCard
     * @return
     */
    public static boolean isValidateIdCard(String idCard) throws Exception{
    	//验证是否是过有效字符串
    	if(!StringUtil.isValidateString(idCard)){
    		return false;
    	}
    	//去除前后空格
    	idCard=idCard.trim();
    	//验证身份证号码是不是15位或18位
    	if(idCard.length()!=OLD_IDCARD_LEN && idCard.length()!=NEW_IDCARD_LEN){
    		return false;
    	}
    	//验证身份证号码行政区划分代码是否有效
    	if(!isValidateCantonCode(idCard)){
    		return false;
    	}
    	//身份证生日号码
    	String birthday="";
    	
    	if(idCard.length()==OLD_IDCARD_LEN){
    		if(StringUtil.isCompleteNumberString(idCard)){
    			birthday=YEAR_FLAG+idCard.substring(6,12);
    		}
    	}else{
    		if(StringUtil.isCompleteNumberString(idCard.substring(0,17))){
    			if(isValidateLastCode(idCard.substring(17, idCard.length()))){
    				birthday=idCard.substring(6, 14);
    			}
    		}
    	}
    	//验证生日日期格式是否有效
		if(!StringUtil.isValidateDateString(birthday, "yyyyMMdd")){
			return false;
		}
		//验证新身份证最后一位是否有效
		if(idCard.length()==NEW_IDCARD_LEN){
			String lastCode=getCheckCode(idCard.substring(0,17));
			if(!(String.valueOf(idCard.charAt(17)).equalsIgnoreCase(lastCode))){
				return false;
			}
		}
		
    	return true;
    }
    /**
     * 将旧身份证号码转化为新身份证号码
     * @param code
     * @return
     * @throws Exception
     */
	public static String oldCard2newCarid(String oldIdCard) throws Exception{
		if(!StringUtil.isValidateString(oldIdCard)){
			return "";
		}
		oldIdCard=oldIdCard.trim();
		if(oldIdCard.length()!=OLD_IDCARD_LEN||!isValidateIdCard(oldIdCard)){
			return "";
		}
		oldIdCard=oldIdCard.substring(0,6)+YEAR_FLAG+oldIdCard.substring(6);
		oldIdCard=oldIdCard+getCheckCode(oldIdCard);
		return oldIdCard;
	}
	/**
	 * 测试
	 * @param args
	 * @throws Exception
	 */
	public static void main(String args[]) throws Exception{
		System.out.println(IdCardUtil.isValidateIdCard("000000000000000000"));
	}
}

 

package string_util;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;


public final class StringUtil{
	/**
	 * 字符串数组合并
	 * @param stringAry 字符串数组
	 * @param joinToken 分隔符
	 * @return 合并后的字符串
	 */
	public static String join(String []stringAry,String joinToken){
		if(stringAry==null||stringAry.length<=0){
			return null;
		}
		if(joinToken==null||joinToken.equalsIgnoreCase("null")){
			joinToken="";
		}
		joinToken=joinToken.trim();
		StringBuffer sb=new StringBuffer();
		for(int i=0;i<stringAry.length;i++){
			if(i>0){
				sb.append(joinToken);
			}
			sb.append(stringAry[i]);
		}
		return sb.toString();
	}
	/**
	 * 将整数字符串转化为整数
	 * @param str 数字字符串
	 * @return 转化后的Int类型
	 * @throws NumberFormatException
	 */
	public static int convertInteger(String str) throws NumberFormatException{
		int number=0;
		if(!isValidateString(str)){
			return number;
		}
		str=str.trim();
		try {
			number=Integer.parseInt(str);
		} catch (NumberFormatException e) {
			throw e;
		}
		return number;
	}
	/**
	 * 将浮点数的字符串转化为浮点数
	 * @param str 要转化的字符串
	 * @return 转化后的浮点数
	 * @throws NumberFormatException
	 */
	public static float convertFloat(String str)throws NumberFormatException{
		float number=0.0f;
		if(!isValidateString(str)){
			return number;
		}
		str=str.trim();
		try {
			number=Float.parseFloat(str);
		} catch (NumberFormatException e) {
			throw e;
		}
		return number;
	}
	/**
	 * 将双精度浮点数的字符串转化为双精度浮点数
	 * @param str 要转化的字符串
	 * @return 转化后的值
	 * @throws NumberFormatException
	 */
	public static double convertDouble(String str)throws NumberFormatException{
		double number=0.0;
		if(!isValidateString(str)){
			return number;
		}
		str=str.trim();
		try {
			number=Double.parseDouble(str);
		} catch (NumberFormatException e) {
			throw e;
		}
		return number;
	}
	/**
	 * 验证字符串合法性(即该字符串不可以为null)
	 * 该方法不除去字符串中空格
	 * @param str String
	 * @return 如果为空就返回""
	 */
	public static String CheckString(String str){
		if(str==null||str.equalsIgnoreCase("null")){
			return "";
		}
		/**
		 * 除去前后的空格
		 */
		return str.trim();
	}
	/**
	 * 验证字符串合法性(该字符串可以为null)
	 * 该方法不除去字符串中空格
	 * @param str String
	 * @return 如果为空就返回""
	 */
	public static String ValidateString(String str){
		if(str==null){
			return "";
		}
		/**
		 * 除去前后的空格
		 */
		return str.trim();
	}
	/**
	 * 验证是否是个有效字符串
	 * @param str
	 * @return
	 */
	public static boolean isValidateString(String str){
		if(str==null){
			return false;
		}
		if(str.trim().equals("")){
			return false;
		}
		if(str.equalsIgnoreCase("null")){
			return false;
		}
		return true;
	}
	/**
	 * 从当前字符串中某个字符开始截取字符串
	 * @param str String
	 * @param singleChar String字符标记
	 * @param front boolean 如果值为true表式截取标记字符前面的字符,反之相反
	 * @return 截取后字符串
	 */
	public static String cutString(String str,String singleChar,boolean front){
		if(!isValidateString(str)){
			return "";
		}
		if(!isValidateString(singleChar)){
			return "";
		}
		str=str.trim();
		singleChar=singleChar.trim();
		if(str.contains(singleChar)){
			int index=str.indexOf(singleChar);
			if(front){
				return str.substring(0,index);
			}else{
				return str.substring(index+1,str.length());
			}
		}else{
			return str;
		}
	}
	/**
	 * 将数据库中取出以字符串形式表示的日期
	 * 转化为:1999-09-09日期格式形式
	 * @param dbStr String
	 * @return  String 转化后的字符串
	 */
	public static String toDateString(String dbStr){
		
		if(!isValidateString(dbStr)){
			return "";
		}
		dbStr=dbStr.trim();
		return dbStr.substring(0,10);
	}
	/**
	 * 将字符串一个字母转换为大写
	 * @param name
	 * @return
	 */
	public static String toUpperCaseFirstLetter(String name){
		if(!isValidateString(name)){
			return "";
		}
		name=name.trim();
		if(name.length()>0){
			return name.substring(0,1).toUpperCase()+name.substring(1);
		}
		return "";
	}
	/**
	 * 将JavaBean属性名转化为其set和get方法名称
	 * 其转化规则如下:(1)属性名的第二个字母若为大写则不用将首字母转换为大写
	 * @param prppertyName
	 * @return
	 */
	public static String toJavaBeanPropertyForSetOrGetMethodName(String propertyName){
		if(!isValidateString(propertyName)){
			return "";
		}
		propertyName=propertyName.trim();
		if(propertyName.length()<=1){
			return propertyName.toUpperCase();
		}else{
			char secondLetter=propertyName.charAt(1);
			if(secondLetter>='A'&& secondLetter<='Z'){
				return propertyName;
			}else{
				return toUpperCaseFirstLetter(propertyName);
			}
		}
	}
	/**
	 * 将日期字符串转换为日期对象
	 * @param dateString
	 * @return
	 * @throws ParseException
	 */
	public static Date toStringForDate(String dateString) throws Exception{
		Date date=null;
		if(!isValidateString(dateString)){
			throw new Exception("非日期格式字符串");
		}
		dateString=dateString.trim();
		DateFormat format=DateFormat.getDateInstance();
		
		try {
			date=format.parse(dateString);
		} catch (ParseException e) {
			throw e;
		}
		return date;
	}
	/**
	 * 验证字符串是不是完全有数字和小数点组成
	 * 此方法还不可以验证16进制和八进制的数据
	 * @param number
	 * @return
	 */
	public static boolean isNumberString(String number){
		
		if(!isValidateString(number)){
			return false;
		}
		number=number.trim();
		char[] nums=number.toCharArray();
		for(int i=0;i<nums.length;i++){
			if((nums[i]>='0'&& nums[i]<='9')||(nums[i]=='.')){
				continue;
			}else{
				return false;
			}
		}
		return true;
	}
	/**
	 * 验证字符串是不是完全有数字组成
	 * @param number
	 * @return
	 */
	public static boolean isCompleteNumberString(String number){
		
		if(!isValidateString(number)){
			return false;
		}
		number=number.trim();
		char[] nums=number.toCharArray();
		for(int i=0;i<nums.length;i++){
			if((nums[i]<'0'|| nums[i]>'9')){
				return false;
			}
		}
		return true;
	}
	/**
	 * 验证日期格式字符串是否和指定样式匹配
	 * @param date 
	 * @param style 指定样式
	 * @return
	 * @throws Exception
	 */
	public static boolean isValidateDateString(String dateStr,String style) throws Exception{
		if(!isValidateString(style)){
			return false;
		}
		if(!isValidateString(dateStr)){
			return false;
		}
		Date date=null;
		try{
		SimpleDateFormat sdf=new SimpleDateFormat(style);
		date =sdf.parse(dateStr);
		}catch(Exception e){
			throw e;
		}
		if(date==null){
			return false;
		}
		return true;
	}
	/**
	 * 测试方法
	 * @param args
	 * @throws Exception 
	 */
	public static void main(String args[]) throws Exception{
//		System.out.println(StringUtil.toJavaBeanPropertyForSetOrGetMethodName("aBc"));
		if(StringUtil.isValidateDateString("19860912","yyyyMMdd")){
			System.out.println("yes");
		}else{
			System.out.println("no");
		}
	}
}

 

2
0
分享到:
评论

相关推荐

    Oracle检查身份证合法性函数.txt

    该函数是支持Oracle环境下的对身份照进行校验的函数,它是按照身份照计算算法去校验的,能够精准的判断出身份照是否合法,通过返回值为1:表示为正确的身份证,返回值为0表示为错误的身份证

    [VB.NET源码]新旧身份证换算

    【VB.NET源码】新旧身份证换算是一个与编程语言VB.NET相关的话题,涉及到的身份信息处理是.NET框架下的一个常见应用。在这个项目中,开发者可能实现了将旧版15位身份证号码转换为新版18位身份证号码的功能。18位...

    身份证算法验证

    这是一个网页源码,身份证的验证。利用JavaScript制作的。

    具有状态合法性验证的区块链一致性算法研究.pdf

    传统拜占庭一致性中常见的中心化和去中心化算法在解决合法性验证的过程中存在容错率低、消息复杂度高等问题,为此,提出新的区块链一致性算法,引入两阶段提交和法定人数投票的过程,利用区块链协议的分布式总账特点...

    C#身份证验证.txtC#身份证验证.txtC#身份证验证.txt

    总之,身份证验证在许多应用中都是一个关键环节,尤其是在用户注册、身份认证或数据录入等场景下,确保身份证信息的准确性和合法性至关重要。通过理解身份证的结构和验证规则,可以有效地提高系统的安全性和用户体验...

    python版身份证识别算法

    Python版身份证识别算法是利用计算机视觉和机器学习技术来自动识别身份证件上的文字信息,尤其在现代社会中,这种技术有着广泛的应用,例如在银行开户、网络注册、酒店入住等场景。该算法通常包括图像预处理、字符...

    身份证验证算法

    身份证验证算法是用于确认个人身份的一种重要技术,它基于我国公民身份证号码的编码规则进行设计。身份证号码由18位数字组成(在某些情况下可能是15位),包含了丰富的个人信息,如出生地、出生日期和性别。这个算法...

    java验证身份证有效性函数类

    根据中国公民身份证号码算法 实现验证身份证号码合法性 已实现java类函数 可直接调用即可 非常方便实用

    java身份证号验证源代码

    在Java编程中,身份证号码验证...在处理用户输入时,可以调用此类的方法来验证身份证号的有效性,确保数据的准确性。对于压缩包中的"qq"文件,可能是相关的Java源代码文件,可以查看其具体实现,学习并理解其中的细节。

    java 身份证验证程序

    此外,还可以考虑异常处理和输入的合法性,例如检查字符是否全为数字等。 总结来说,"java 身份证验证程序"涉及的知识点包括: 1. Java字符串操作(substring(), length()) 2. Java日期处理(LocalDate, ...

    身份证验证器

    【身份证验证器】是一款用于身份证真伪查询的软件工具,主要功能是帮助用户验证中国居民身份证的合法性。在日常生活中,我们可能需要确认个人身份信息的真实性,例如在租房、招聘、网络交易等场合,该工具就能派上...

    身份证验证delphi窗口

    总之,“身份证验证delphi窗口”项目是一个涉及Delphi编程、身份证验证算法实现以及GUI界面设计的综合实践。通过这个项目,开发者不仅可以掌握Delphi的基本用法,还能学习到如何处理实际生活中的数据验证问题。

    身份证算法(二)和表单验证

    本文将深入探讨身份证号码的算法以及如何利用正则表达式(RegExp)进行表单验证,旨在帮助开发者提升应用程序的安全性和用户体验。 首先,让我们理解身份证号码的构成。中国的身份证号码由18位数字组成,分为五个部分...

    18位身份证号码验证算法.doc

    18位身份证号码验证算法.doc

    JAVA身份证号码验证工具

    JAVA身份证号码验证工具,通过身份证号码生成规则,能验证15位、18位身份证号码,必备验证方式

    C# 身份证 验证类 DLL 带源码

    这个"C# 身份证验证类 DLL 带源码"是一个专门用于验证中国公民身份证合法性的开发工具,它可以帮助开发者快速集成到自己的应用程序中,进行有效的身份验证。以下是关于这个DLL及其源码的详细知识点: 1. **C#编程...

    struts2+ajax 无刷新验证身份证号是否已注册,身份证号是否正确

    ### Struts2 + AJAX 实现无刷新验证身份证号是否已注册及正确性的技术解析 #### 一、背景介绍 ...例如,可以通过引入更复杂的验证算法来增强身份证号验证的安全性,或者增加更多的异常处理逻辑来提高系统的健壮性。

    JS验证身份证号与验证材料

    - 对于敏感信息如身份证号,要确保在前端进行验证的同时,在服务器端也要进行二次验证,提高安全性。 以上是关于“JS验证身份证号与验证材料”的详细内容,通过这些知识点,开发者可以创建一个有效的身份证号码...

Global site tag (gtag.js) - Google Analytics