今天,在盛大某网站注册的时候,身份证必填,但我又不想填真实身份证号码,于是随便编了串自认为合法的身份证号码,但是却马上被提示号码错误,由于响应速度极快,可以肯定不是联机校验正确性的,那也就是说第二代身份证除了大家都知道的几位表示生日和性别的规则以外,还有另外的自我校验规则。于是翻开页面源码查看,发现这段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
这个也有问题,当时16岁时候,用AS写了一个生成器,然后去附近网吧上网,当场被发现,然后撵了出来……
iCyOMiK
神奇。
est
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
传说中的单行党= =
依云
Python3 里 reduce 移到 functools 里了,不过这里可以用 sum 代替。
依云
来个带校验的 :-)
#!/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])
李刚
谁叫你公布的!
oceanboo
这个确实比较out,大概两三年前我们公司的项目就有写这个身份证的验证了。
凡客
一般身份验证不严的网站随便搞搞都可以搞定的,不过有的网站是用公安系统对应姓名查询的就有点难搞了。
风吹雨飞
我以前用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);
冯海涛
哪个部门让你公布的?
UI设计
牛人啊!!
chenfengyuan
计算校验码的单行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
’改成普通的单引号
Louis Han
就最后一位是个校验位 就是废柴
asniler
最后的那个,可以写成:
var sJYM=’01×98765432′.charAt(iJYM);
以代替原来的那么多行代码。可能源作者是elsif控。
请你喝茶
你是哪个部门的?你的领导是谁?
MeaCulpa
非技术角度来说, 身份证号码包含地域和生日信息是极其粗暴的。 赤裸裸的泄露国家机密,很多数位也浪费的很厉害,比如出生年月日,浪费的太多了
leaf
HO~原来身份证不光分段校验啊,,,受益匪浅啊.. mark