冰砚炽
咸鱼中的咸鱼
冰糖开发日志

身份证号计算校验码与验证校验码

身份证规则

首先感谢李永乐老师的视频帮助我理解身份证规则公式和求校验码公式(av86690236)。

公式理解

https://www.yistars.cn/wp-content/webpc-passthru.php?src=https://www.yistars.cn/wp-content/uploads/2020/02/ID-number.png&nocache=1

设计校验码是为了防止输错身份证号,校验码可以验证身份证号是否输入正确,判断是否符合身份证规则,并不起防伪作用。验证公式:\[\sum\limits_{i = 1}^{18} {ai \cdot wi \equiv 1\left( {\bmod 11} \right)} \]

ai: 从右向左第 i 位数 wi: 加权因子↓\[(\mathop 2\nolimits^{i – 1} \bmod 11)\]

上面的公式可以简化理解为:比如说现在有一个 “ 220202202002020022 ” 的身份证号(如下表,其中 wi 的值恒定,只有 ai 的值会随着身份证号变化),应满足每列的两个数相乘,然后再将每列的结果相加,再将此时的值除以 11 ,得到余 1,那么这个身份证号就是符合身份证规则的。

ai220202202002020022
wi79105842163791058421

代码实践

# By Bing_Yanchi
id_num = '220202202002020022'

factor = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1]

def main():
	num = 0
	for i in range(18):
		num += int(id_num[i]) * factor[i]
	if num % 11 == 1:
		print('正确')
	else:
		print('错误')
main()

求校验码

公式理解

通过简单计算,可以得到根据身份证前 17 位求最后一位校验码的公式(若算出结果为 10 ,则写作罗马字母 “ X ” ):\[\mathop a\nolimits_1 = \left( {12 – \sum\limits_{i = 2}^{18} {ai \cdot wi \cdot \bmod 11} } \right)\bmod 11\]

代码实践

# By Bing_Yanchi
id_num = '22020220200202002'

factor = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]

def main():
	num = 0
	for i in range(17):
		num += int(id_num[i]) * factor[i]
	print((12 - num % 11) % 11)
main()

实名验证

实名验证现在运用范围比较广,不同用途的实名验证对于实名真实性的要求也有所不同。但绝大多数至少会验证所填的身份证号是否符合身份证规则。

公安验证

需要进行公安验证的重要性一般比较高,比如说支付身份验证。这类的身份验证将会将姓名和身份证号通过公安的接口(或间接,指通过第三方)进行验证,确认身份证号是否存在,姓名和身份证号是否对应。

非公安验证

由于公安部不会随意将接口开放给个人企业,但现在有一些第三方实名认证机构,直接调用 api 就可以验证,数据来源还是一致的。 一些验证要求不高的实名验证通常不进行公安验证(例如防沉迷),并不是每家公司都会支付给第三方机构来使用这样的验证服务,通常符合身份证规则就完成了验证,将其信息储存下来。

本文链接:https://www.yistars.cn/id-check-code/
本文采用 CC BY-NC-SA 3.0 Unported 协议进行许可
没有标签
首页      编程      Python      身份证号计算校验码与验证校验码
Avatar photo

冰砚炽

文章作者

咸鱼中的咸鱼

发表回复

textsms
account_circle
email

冰糖开发日志

身份证号计算校验码与验证校验码
实名验证现在运用范围比较广,不同用途的实名验证对于实名真实性的要求也有所不同。但绝大多数至少会验证所填的身份证号是否符合身份证规则。
扫描二维码继续阅读
2020-03-12