没啥意思的站点

天朝第二代身份证号码的验证机制

今天,在盛大某网站注册的时候,身份证必填,但我又不想填真实身份证号码,于是随便编了串自认为合法的身份证号码,但是却马上被提示号码错误,由于响应速度极快,可以肯定不是联机校验正确性的,那也就是说第二代身份证除了大家都知道的几位表示生日和性别的规则以外,还有另外的自我校验规则。于是翻开页面源码查看,发现这段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; //对不上就是假号码
}

19 评论

  1. 这个也有问题,当时16岁时候,用AS写了一个生成器,然后去附近网吧上网,当场被发现,然后撵了出来……

  2. 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]

    • 传说中的单行党= =

    • 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])

  3. 谁叫你公布的!

  4. 这个确实比较out,大概两三年前我们公司的项目就有写这个身份证的验证了。

  5. 一般身份验证不严的网站随便搞搞都可以搞定的,不过有的网站是用公安系统对应姓名查询的就有点难搞了。

  6. 我以前用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);

  7. 哪个部门让你公布的?

  8. 计算校验码的单行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))’

  9. 就最后一位是个校验位 就是废柴

  10. 最后的那个,可以写成:

    var sJYM=’01×98765432′.charAt(iJYM);
    以代替原来的那么多行代码。可能源作者是elsif控。

  11. 你是哪个部门的?你的领导是谁?

  12. 非技术角度来说, 身份证号码包含地域和生日信息是极其粗暴的。 赤裸裸的泄露国家机密,很多数位也浪费的很厉害,比如出生年月日,浪费的太多了

  13. HO~原来身份证不光分段校验啊,,,受益匪浅啊.. mark

发表评论