天朝第二代身份证号码的验证机制
今天,在盛大某网站注册的时候,身份证必填,但我又不想填真实身份证号码,于是随便编了串自认为合法的身份证号码,但是却马上被提示号码错误,由于响应速度极快,可以肯定不是联机校验正确性的,那也就是说第二代身份证除了大家都知道的几位表示生日和性别的规则以外,还有另外的自我校验规则。于是翻开页面源码查看,发现这段js没有被压缩,所以规则也很好懂。
就在这里给大家科普下,不知道是不是火星了,呵呵。
以下代码来自这里,版权归盛大。当然,你也可以在维基百科找到更详细的介绍和算法。
iW = new Array(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1); iSum = 0; for( i=0;i<17;i++){ iC = v_card.charAt(i) ; iVal = parseInt(iC); iSum += iVal * iW[i]; } iJYM = iSum % 11; var sJYM = ''; if(iJYM == 0) sJYM = "1"; else if(iJYM == 1) sJYM = "0"; else if(iJYM == 2) sJYM = "x"; else if(iJYM == 3) sJYM = "9"; else if(iJYM == 4) sJYM = "8"; else if(iJYM == 5) sJYM = "7"; else if(iJYM == 6) sJYM = "6"; else if(iJYM == 7) sJYM = "5"; else if(iJYM == 8) sJYM = "4"; else if(iJYM == 9) sJYM = "3"; else if(iJYM == 10) sJYM = "2"; var cCheck = v_card.charAt(17).toLowerCase(); if( cCheck != sJYM ){ return false; //对不上就是假号码 } |
francis 在 2011年01月01日 19:28 说:【 】
这个也有问题,当时16岁时候,用AS写了一个生成器,然后去附近网吧上网,当场被发现,然后撵了出来……
iCyOMiK 在 2011年01月01日 19:47 说:【 】
神奇。
est 在 2011年01月01日 19:59 说:【 】
print ’10X98765432′[reduce(lambda x,y:x+y, map(lambda x:int(x[0])*x[1], zip(‘51000018880101001′[0:17], [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]) )) % 11]
zino 在 2011年01月02日 00:02 说:【 】
传说中的单行党= =
依云 在 2011年01月02日 23:04 说:【 】
Python3 里 reduce 移到 functools 里了,不过这里可以用 sum 代替。
依云 在 2011年01月02日 23:15 说:【 】
来个带校验的 :-)
#!/usr/bin/env python3
import sys
len(sys.argv) != 2 and (print(‘请给出一个至少 17 位数字的参数’, file=sys.stderr) or sys.exit(1)) or len(sys.argv[1]) not in (17,18) and (print(‘参数错!’, file=sys.stderr) or sys.exit(2)) or print(’10X98765432′[sum(map(lambda x:int(x[0])*x[1], zip(sys.argv[1][:17], [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]))) % 11])
李刚 在 2011年01月01日 23:36 说:【 】
谁叫你公布的!
oceanboo 在 2011年01月02日 10:59 说:【 】
这个确实比较out,大概两三年前我们公司的项目就有写这个身份证的验证了。
Tweets that mention I am LAZY bones ? : 天朝第二代身份证号码的验证机制 -- Topsy.com 在 2011年01月03日 03:48 说:【 】
[…] This post was mentioned on Twitter by shizhao, 骨头, rookie, ChinaShare, Melody and others. Melody said: 【GR分享】天朝第二代身份证号码的验证机制 https://luy.li/2011/01/01/sfzhm/ […]
凡客 在 2011年01月03日 09:54 说:【 】
一般身份验证不严的网站随便搞搞都可以搞定的,不过有的网站是用公安系统对应姓名查询的就有点难搞了。
风吹雨飞 在 2011年01月03日 11:14 说:【 】
我以前用perl写的一个
my %xishu = qw(
0 7
1 9
2 10
3 5
4 8
5 4
6 2
7 1
8 6
9 3
10 7
11 9
12 10
13 5
14 8
15 4
16 2
);
my %res = qw(
0 1
1 0
2 x
3 9
4 8
5 7
6 6
7 5
8 4
9 3
10 2
);
sub chkid {
my $sum = 0;
my @id = split( ”, $_[0] );
my $i = 0;
foreach ( @id[ 0 .. 16 ] ) {
$sum = $sum + ( $_ * $xishu{$i} );
$i++;
}
return 1 if $id[17] eq $res{ $sum % 11 };
return 0;
}
chomp( $n = );
print “真实身份证\n” if &chkid($n);
身份证号码验证 « The Flash Blog 在 2011年01月03日 16:19 说:【 】
[…] 在Lazy Bones […]
冯海涛 在 2011年01月03日 20:11 说:【 】
哪个部门让你公布的?
第二代身份证号码的验证机制. - CssRain-前端技术 - 读者的进步速度远大于博客的进步速度。 在 2011年01月04日 10:57 说:【 】
[…] 文章链接:https://luy.li/2011/01/01/sfzhm/ 你可以发表评论、引用到你的网站或博客,或通过RSS 2.0订阅这个日志的所有评论。 上一篇:百度JavaScript项目tangram。 没有评论▼ 我来说两句 […]
UI设计 在 2011年01月04日 11:23 说:【 】
牛人啊!!
天朝第二代身份证号码的验证机制 | 精品文摘 在 2011年01月05日 14:42 说:【 】
[…] 转自:天朝第二代身份证号码的验证机制 此条目发表在 IT技术 分类目录。将固定链接加入收藏夹。 ← 恶搞javascript来对付盗链 […]
chenfengyuan 在 2011年01月09日 07:24 说:【 】
计算校验码的单行perl
echo 63280119790817003|perl -F// -ane ‘@a=(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2);$s+=$a[$_]*$F[$_] for (0..$#a);print +(12-($s%11))’
chenfengyuan 在 2011年01月09日 07:25 说:【 】
’改成普通的单引号
Louis Han 在 2011年01月13日 13:21 说:【 】
就最后一位是个校验位 就是废柴
asniler 在 2011年01月24日 12:44 说:【 】
最后的那个,可以写成:
var sJYM=’01×98765432′.charAt(iJYM);
以代替原来的那么多行代码。可能源作者是elsif控。
请你喝茶 在 2011年03月21日 15:52 说:【 】
你是哪个部门的?你的领导是谁?
MeaCulpa 在 2011年05月10日 16:53 说:【 】
非技术角度来说, 身份证号码包含地域和生日信息是极其粗暴的。 赤裸裸的泄露国家机密,很多数位也浪费的很厉害,比如出生年月日,浪费的太多了
第二代身份证号码验证方法 - 安肄 . 分享关于设计 互联网的一切 在 2011年09月11日 20:43 说:【 】
[…] via […]
leaf 在 2011年09月17日 09:29 说:【 】
HO~原来身份证不光分段校验啊,,,受益匪浅啊.. mark