C#身份证验证

只是客户端身份证验证, 最后还是需要服务器接入身份验证系统验证,

    #region 身份证号码验证
    /*
     * 身份证验证的工具(支持5位或18位省份证)
     * 身份证号码结构:
     * 17位数字和1位校验码:6位地址码数字,8位生日数字,3位出生时间顺序号,1位校验码。
     * 地址码(前6位):表示对象常住户口所在县(市、镇、区)的行政区划代码,按GB/T2260的规定执行。
     * 出生日期码,(第七位 至十四位):表示编码对象出生年、月、日,按GB按GB/T7408的规定执行,年、月、日代码之间不用分隔符。
     * 顺序码(第十五位至十七位):表示在同一地址码所标示的区域范围内,对同年、同月、同日出生的人编订的顺序号,
     * 顺序码的奇数分配给男性,偶数分配给女性。 
     * 校验码(第十八位数):
     * 十七位数字本体码加权求和公式 s = sum(Ai*Wi), i = 0,,16,先对前17位数字的权求和;   
     *  Ai:表示第i位置上的身份证号码数字值.Wi:表示第i位置上的加权因.Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2;
     * 计算模 Y = mod(S, 11) 
     * 通过模得到对应的校验码 Y: 0 1 2 3 4 5 6 7 8 9 10 校验码: 1 0 X 9 8 7 6 5 4 3 2 
     */
    static Dictionary<int, String> zoneNum = new Dictionary<int, String>()
    {
        {11, "北京"  },
        {12, "天津"  } ,
        {13, "河北"  } ,
        {14, "山西"  } ,
        {15, "内蒙古" } ,
        {21, "辽宁"  } ,
        {22, "吉林"  } ,
        {23, "黑龙江" } ,
        {31, "上海"  } ,
        {32, "江苏"  } ,
        {33, "浙江"  } ,
        {34, "安徽"  } ,
        {35, "福建"  } ,
        {36, "江西"  } ,
        {37, "山东"  } ,
        {41, "河南"  } ,
        {42, "湖北"  } ,
        {43, "湖南"  } ,
        {44, "广东"  } ,
        {45, "广西"  } ,
        {46, "海南"  } ,
        {50, "重庆"  } ,
        {51, "四川"  } ,
        {52, "贵州"  } ,
        {53, "云南"  } ,
        {54, "西藏"  } ,
        {61, "陕西"  } ,
        {62, "甘肃"  } ,
        {63, "青海"  } ,
        {64, "宁夏"  } ,
        {65, "新疆"  } ,
        {71, "台湾"  } ,
        {81, "香港"  } ,
        {82, "澳门"  } ,
        {91, "外国" } ,
    };

    static readonly int[] PARITYBIT = { '1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2' };
    static readonly int[] POWER_LIST = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };

    /// <summary>
    /// 身份证验证( 正规的验证需要接公安系统 )
    /// </summary>
    /// <param name="certNo">号码内容</param>
    /// <returns>是否有效</returns>
    public static bool IDCardValidate(string certNo)
    {
        if (certNo == null || (certNo.Length != 15 && certNo.Length != 18))
        {
            return false;
        }
        char[] cs = certNo.ToUpper().ToCharArray();
        //校验位数
        int power = 0;
        for (int i = 0; i < cs.Length; i++)
        {
            if (i == cs.Length - 1 && cs[i] == 'X')
            {
                break;//最后一位可以 是X或x
            }
            if (cs[i] < '0' || cs[i] > '9')
            {
                return false;
            }
            if (i < cs.Length - 1)
            {
                power += (cs[i] - '0') * POWER_LIST[i];
            }
        }
        //校验区位码
        if (!zoneNum.ContainsKey(int.Parse(certNo.Substring(0, 2))))
        {
            return false;
        }

        //校验年份
        String year = certNo.Length == 15 ? "19" + certNo.Substring(6, 2) : certNo.Substring(6, 4);

        int iyear = int.Parse(year);
        if (iyear < 1900 || iyear > DateTime.Now.Year)
        {
            return false;//1900年的PASS,超过今年的PASS
        }
        //校验月份
        String month = certNo.Length == 15 ? certNo.Substring(8, 2) : certNo.Substring(10, 2);
        int imonth = int.Parse(month);
        if (imonth < 1 || imonth > 12)
        {
            return false;
        }

        //校验天数      
        String day = certNo.Length == 15 ? certNo.Substring(10, 2) : certNo.Substring(12, 2);
        int iday = int.Parse(day);
        if (iday < 1 || iday > 31)
        {
            return false;
        }
        //校验"校验码"
        if (certNo.Length == 15)
        {
            return true;
        }
        if (cs[cs.Length - 1] == PARITYBIT[power % 11])
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    #endregion
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值