V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Wallace01
V2EX  ›  问与答

身份证号的 X 是不是一个糟糕的设计?

  •  
  •   Wallace01 · 135 天前 · 10056 次点击
    这是一个创建于 135 天前的主题,其中的信息可能已经有所发展或是发生改变。
    身份证号校验位(最后一位)的设计原理是,用前面的数字通过一系列计算结果除以 11 取余数,分别对应 1-9 和 x 。不用 10 的原因是校验效果不好。

    大家觉得这个设计怎么样呢。
    100 条回复    2022-07-22 13:40:34 +08:00
    citydog
        1
    citydog  
       135 天前   ❤️ 1
    不管怎么样,也用了这么多年了,也没出啥问题,日后还将继续这样
    说它好不好没啥意义吧?你还能把它改了?
    cssk
        2
    cssk  
       135 天前   ❤️ 8
    不糟糕,香港的身份证号 tmd 还带括号呢
    Wallace01
        3
    Wallace01  
    OP
       135 天前   ❤️ 18
    @citydog 这里不是人大,只讨论设计,不必想这么多意义。
    wonderfulcxm
        4
    wonderfulcxm  
       135 天前 via iPhone
    当然不好,对输入设备有要求了,纯数字只要数字键盘
    Wallace01
        5
    Wallace01  
    OP
       135 天前
    口误一处:对应 0-9 不是 1-9
    v23x
        6
    v23x  
       135 天前
    的确不好.要是我肯定很抗拒这种设计.感觉不够统一
    nutting
        7
    nutting  
       135 天前 via iPhone
    校验有啥用
    JQSM
        8
    JQSM  
       135 天前
    @wonderfulcxm 数字键盘不止有 0-9 ,这倒不是什么问题。
    Xusually
        9
    Xusually  
       135 天前
    还行吧 反正证件种类也很多,可以填写身份证的地方很多时候也可以切换证件类型填写 护照、港澳通行证、台湾通行证之类的,都有字母
    Akagi201
        10
    Akagi201  
       135 天前
    同问为啥需要校验, 手机号不是也不需要校验
    villivateur
        11
    villivateur  
       135 天前
    校验位是为了快速判断身份证号是否是伪造。话说当时不知道是哪个专家论证了一下,说 11 位比 10 位更安全
    subpo
        12
    subpo  
       135 天前   ❤️ 6
    主要是判断有没有输入错误的 checksum ,规则都是公开的,判断不了伪造
    tabris17
        13
    tabris17  
       135 天前   ❤️ 8
    之前用过某个国家级的 APP ,输入身份证是 APP 内置的数字键盘,没有 X !
    没有 X !
    没有 X !
    kop1989smurf
        14
    kop1989smurf  
       135 天前   ❤️ 3
    @nutting #7
    @Akagi201 #10
    校验的意义:

    身份证其他位都有明确的业务信息,前六位是位置,后面八位是出生年月,再往后是登记序号。
    这也就导致但凡你稍加了解,就可以随口编造出任何地理位置,出生年月的身份证号,蒙到一个真号的概率极高。

    校验位就是不让你这么方便的编造。
    Akagi201
        15
    Akagi201  
       135 天前
    @kop1989smurf #14 通信领域有校验位, 为了防止传输时候数据出错的. 这里自己根据算法算一下校验位没啥难度. 没啥一样. 我们平时设计 id 的时候也用不到校验位
    kop1989smurf
        16
    kop1989smurf  
       135 天前
    @Akagi201 #15 同意你的看法,有机器辅助的前提下当然无法防止伪造,我所谓的编造,类似是“录错”或者“张口就来”的场景。
    sobigfish
        17
    sobigfish  
       135 天前
    是,模除 10 不行吗?非得 11
    teasick
        18
    teasick  
       135 天前   ❤️ 31
    身份证号最糟糕的设计是包含了太多个人信息在里面,偏偏又很多地方要用到身份证号,相当于公开裸奔导出泄露,泄漏一个身份证号,意味着同时泄露了出生日期和出生地。
    estk
        19
    estk  
       135 天前 via Android
    @tabris17 #13
    输入框下方备注:如果你身份证号有 X ,请在微信编辑复制,然后回来长按黏贴
    jifengg
        20
    jifengg  
       135 天前   ❤️ 5
    我还有一个觉得不好的地方,x 是有大小写的,有的系统不忽略大小写,会导致不匹配。
    hzcer
        21
    hzcer  
       135 天前 via iPhone   ❤️ 6
    因为 11 是质数,10 不是
    masterclock
        22
    masterclock  
       135 天前
    不好,无法理解为什么这么设计
    1. 增加了一个原本不使用的符号,无法输入、甚至无法显示
    2. X 是什么?很多人不认识、不会读。
    3. 模 11 效果比模 10 好很多吗?如果是,还不如升 19 位
    Wallace01
        23
    Wallace01  
    OP
       135 天前 via iPhone   ❤️ 4
    个人觉得,不改变校验算法前提下,我宁愿用两位表示校验位,00-10 ,这样比 X 带来的影响小一些
    cpstar
        24
    cpstar  
       135 天前   ❤️ 3
    换个角度,你要思考为什么这么去校验,一个校验算法,到底要校验什么。目前的算法,前 17 位每一位都用不同的权,但是权不是连续上升或者下降,而是非常离散的,为什么会这样?至于 11 还是 10 ,那就是质数的问题了,那问题来了,能否模 7 ,把校验位降到 0-6 ?
    why ? why ? why ?刨根问底,你就能理解这个算法,并且直接回答这个 X 到底是巧妙还是冗余了。
    JNotEnoughW
        25
    JNotEnoughW  
       135 天前
    @teasick 是的赞同 相比于表现形式 我也更加反感如此赤裸的内容拼接
    cpstar
        26
    cpstar  
       135 天前
    补充 24#,反正现在 18 位如果校验不过去,是能够直接定位哪一位错误的,而存在两位错误我就不知道了。
    zqqf16
        27
    zqqf16  
       135 天前
    我的最后一位就是 X ,平时用起来还好,就是有时候会遇到奇葩系统,X 竟然区分大小写……
    Wallace01
        28
    Wallace01  
    OP
       135 天前 via iPhone
    @teasick 以及性别
    hertzry
        29
    hertzry  
       135 天前   ❤️ 2
    X 不就是 10 吗?用一位表示了 11 个数,挺好的想法。
    luob
        30
    luob  
       135 天前
    校验位带个 X 这个设计恐怕也是 90 年代把世界各国的各种规章制度稀里糊涂乱抄一气的产物之一,不知道有没有谁能考证一下

    不过它既然成功地活了下来,换了三轮身份证都没被重新设计,说明总体上还是没啥问题的
    agegcn
        31
    agegcn  
       135 天前
    可能两位校验更好。可以取模更大的质数
    stephenyin
        32
    stephenyin  
       135 天前   ❤️ 3
    就算是表示 10 ,也应该用 A 啊,用 X 什么鬼设计?不懂 16 进制的人真的是没法交流。
    myevery
        33
    myevery  
       135 天前 via Android
    @hzcer 为什么不用 7
    Maxxxxyu
        34
    Maxxxxyu  
       135 天前   ❤️ 5
    @stephenyin #32 罗马数字 10 就是 X ,估计是因为这个啊
    PureTentacle
        35
    PureTentacle  
       135 天前
    @stephenyin 罗马数字啊
    dcsuibian
        36
    dcsuibian  
       135 天前   ❤️ 4
    不是。
    1 、身份证校验位可以离线先过滤掉一些输入错误,毕竟身份证那么长。
    2 、上面有人说了,11 是质数,10 不是,那“10 进制是不是一个糟糕的设计?”
    3 、X 对应的是罗马数字 10 ,跟 16 进制没啥关系。对文盲,X 可比 A 好多了,你见过几个人念 iphone ten 而不是 iphone 叉呢。
    4 、争端主要在于 X 和双校验位。确实,双校验位就只用数字了。但 X 也有好处,因为真的会有 nc 程序员在数据库里用整形存手机号。
    snw
        37
    snw  
       135 天前 via Android   ❤️ 12
    讨论了这么多楼层,都没有人提到这个标准算法的来源吗?

    身份证校验位是个标准算法,来自于 ISO/IEC 7064 里的 MOD 11-2 ,国标是 GB 11643 。
    另外,这个 ISO 里也有 MOD 11-10 的算法可以让校验位落在 0-9 ,但属于 Hybrid System ,算起来比较麻烦,更重要的是没有快速算法。
    libook
        38
    libook  
       135 天前   ❤️ 6
    参考国家标准《公民身份号码》编号为 GB 11643-1999 ,有这么一个信息:“值等于 10 时,用罗马数字符 X 表示。”

    标准都是公开的,防伪造不大现实,个人认为可能防止录入错误的效果更好。

    直觉上阿拉伯数字之余多了个罗马数字确实可能在使用上会有些不便,但说是糟糕设计倒还不至于。

    这让我想到新入职的开发人员可能会对系统现有设计有诸多看法,但其实很多都是因为一些历史上的变化与取舍才最终发展成这样的,不能完全抛开历史包袱于不顾。
    所以最好是能找到一些当年设计身份号码的过程记载,看看为什么最终选择了这个方案,看看当年选择这个方案是否合理,以及发展到现在是否必然。
    20015jjw
        39
    20015jjw  
       135 天前 via iPhone
    都是数字
    visa 最后一位也是校验
    不细说
    HiCoder
        40
    HiCoder  
       135 天前
    银行账号、三大卡卡组织的卡号,都是有校验位的,防止输错
    longgediyi999
        41
    longgediyi999  
       135 天前
    不怎么样 有时候大写报错 有时候小写报错 有时候大小写都不报错
    snw
        42
    snw  
       135 天前 via Android
    @snw
    顺带一提,除了 GB 11643 外,还有 GB 11714 是这个 ISO 的扩展,还有 GB 32100 也是这个 ISO 的变种(计算顺序反过来)
    zxcslove
        43
    zxcslove  
       135 天前   ❤️ 1
    有没有可能,应用这套体系的时候,计算机系统还没有普及?
    zxCoder
        44
    zxCoder  
       135 天前
    身份证号码刚从 15 位换成 18 位那几年,我就因为最后一位是 X 遇到很多麻烦,不知道的人还以为我在瞎写,整个 X
    flexbug
        45
    flexbug  
       135 天前 via iPhone
    我身份证最后没有 x ,我闺女有,估计她以后会麻烦点
    adoal
        46
    adoal  
       135 天前 via iPhone
    典型的“原理还行,体验不好”
    wonderfulcxm
        47
    wonderfulcxm  
       135 天前 via iPhone   ❤️ 1
    @luob 没有改不是说明没有问题,而是因为太多的人、太多的旧系统还用着原来的规则,并且很多老系统更新也不现实,这一改的成本太大了,还不如将错就错,向前兼容,四个字:积重难返。
    davidyin
        48
    davidyin  
       135 天前 via Android
    早期身分證號,年份只有兩位,也麼有校驗位。
    據說還有重號的。
    davidyin
        49
    davidyin  
       135 天前 via Android
    還有的系統輸入這個 X 还必须大写。
    cubecube
        50
    cubecube  
       135 天前
    @hzcer 7 不也行,本来就是一个校验位
    popok
        51
    popok  
       135 天前
    @villivateur
    @subpo 对,主要是为了判断是不是输错,不是为了判断伪造。
    pkoukk
        52
    pkoukk  
       135 天前   ❤️ 1
    @zxcslove 公布这套系统的时候已经是 1999 年了,在居民家庭普及度可能比较低,但是部门普及度已经很高了。那会儿我爸就是个乡镇公务员,办公室里已经有一台电脑了
    Felix2Yu
        53
    Felix2Yu  
       135 天前
    在那个纸质年代,校验位有意义。但是在这个身份证查验基本都是联网的时代是否还应该存在?
    普通在线系统多数前端也只是正则判断一下位数和每一位的范围。真要实名实人验证的严肃场合,也不会只要求身份证数字校验通过,还要人脸或指纹验证。
    如果要兼容的话其实可以直接删最后一位,改成 17 位。
    xqk111
        54
    xqk111  
       135 天前
    从设计的角度来说,感觉不太好
    atrexl
        55
    atrexl  
       135 天前
    @davidyin 早年的 15 位,重号太正常了。
    sky96111
        56
    sky96111  
       135 天前 via Android
    @tabris17 是的,七八年前我也遇到过这种情况,不记得当时是怎么解决的。近几年是没遇到了。
    sky96111
        57
    sky96111  
       135 天前 via Android
    @sky96111 更正:七、八年前
    hzzz0823
        58
    hzzz0823  
       135 天前 via iPhone
    希望身份证号输入时候允许输入 16 进制
    lambdaq
        59
    lambdaq  
       135 天前
    ISO 7064


    除以 10 效果不好的原因是,不是质数,除了没用。11 是最接近的质数。
    tmxklzp
        60
    tmxklzp  
       135 天前
    看完上面的回复后有个疑问,这个身份证校验位真的需要模 11 吗?就算前面的数字计算结果不够平均但是否模 10 也足够起到校验的作用了呢?
    zxcslove
        61
    zxcslove  
       135 天前
    @pkoukk 是啊,但整体的普及度太小,基层单位多数当做打字机用,另外翻翻纸牌。当时社会上巨量的表单证卡还是手工填写的,位数不固定就不太合适。
    tmxklzp
        62
    tmxklzp  
       135 天前
    回复完后找到了个知乎问题: https://www.zhihu.com/question/20205184
    killeder
        63
    killeder  
       135 天前
    浪费时间的话题
    lisongeee
        64
    lisongeee  
       135 天前
    下一代身份证可以在背面增加二维码表示身份证号,我去做核酸老是扫半天
    littiefish
        65
    littiefish  
       135 天前 via iPhone
    @nutting 根据公式算出来的,你瞎编的话大概率假的
    kakeiri
        66
    kakeiri  
       135 天前
    没有大统一,出生就定义了。本人是 13 开头,去潮州旅游,让登记身份证,工作人员喊了好几次不要写电话,是要写身份证号[摊手]
    loading
        67
    loading  
       135 天前
    如果你在身份证那个时代规划这个号码,你会用什么方式。网络没覆盖。
    xmt328
        68
    xmt328  
       135 天前
    @cpstar 校验码还能做这种事情?那不是应该叫纠错码么?
    nieboqiang
        69
    nieboqiang  
       135 天前
    @Akagi201 防呆设计,如果你不小心输入错了一位,能直接判断出来。
    masker
        70
    masker  
       135 天前 via Android   ❤️ 1
    @stephenyin 为什么你觉得你会 16 进制就很屌一样
    gogorush
        71
    gogorush  
       135 天前
    身份证号码对个人来说肯定是个特别垃圾的东西 为啥这么说 因为这东西是给旧时代的统计人员来弄的 包含太多个人信息 关键问题是 这玩意出错概率太多了 我就认识身份证号码因为同号出问题的 最好用 web3 加个人 token 验证这种 方式来代替掉
    stephenyin
        72
    stephenyin  
       135 天前
    @masker #70 个人认为懂 16 进制的比不懂 16 进制的大概率会屌一点。😂
    redeemer1001
        73
    redeemer1001  
       135 天前
    @dcsuibian #36 最后一点戳中笑点
    masker
        74
    masker  
       135 天前 via Android
    @stephenyin 马云应该不懂 16 进制
    shawnsh
        75
    shawnsh  
       135 天前 via Android
    @lisongeee 条形码都比二维码强,二维码太垃圾
    jobmailcn
        76
    jobmailcn  
       135 天前 via Android
    绝对是,银行卡号最后一位也是校验位,有的卡号 16 位,有的 19 位,都没见卡号里有 X 的,制定身份证号的专家肯定是脑子有 X 才搞出这脑残玩意
    snorlax
        77
    snorlax  
       135 天前   ❤️ 11
    身份证号按二进制的方式展开后除以 11 的余数为 1(包括最后一位,X=10),也就是 Σak*2^k Ξ 1 (mod 11),k=17,16,...,1,0 ,这样只改变一位身份证号就一定通不过校验,因为要使(ai-aj)*2^k Ξ 0 (mod 11),只能使 11|ai-aj ,而 ai 和 aj 都只能取 0-9(或 X,也就是 10),所以不可能。

    但是如果改成 mod 10 的话,只要 ai-aj=5 ,(ai-aj)*2^k Ξ 0 (mod 10)就可能成立,也就是改变一位身份证号也可以通过校验。所以选择了 mod 11 。
    darknoll
        78
    darknoll  
       135 天前
    非常糟糕,垃圾的设计
    EminemW
        79
    EminemW  
       135 天前   ❤️ 1
    其实校验算法很多地方都用到,比如银行卡是用这个 https://en.wikipedia.org/wiki/Luhn_algorithm
    lscho
        81
    lscho  
       134 天前 via iPhone
    @jobmailcn 哪家银行的卡号有 14 亿用户?银行卡号好记还是身份证号好记?
    vone
        82
    vone  
       134 天前   ❤️ 2
    @sobigfish

    身份证号的末位校验码算法最后一步模 11 是基于什么考虑? - 刘巍然-学酥的回答 - 知乎
    https://www.zhihu.com/question/20205184/answer/223049155
    gdm
        83
    gdm  
       134 天前
    这个 X 看着贼拉别扭,既然都模 11 了,怎么不模 31 ?
    另外,我觉得相比起最后一位是字母,我更能接受第一位是字母,比如护照就是这样,不别扭
    thedrwu
        84
    thedrwu  
       134 天前 via Android
    @gdm #83 第一位字母那是变量名😄
    kaneg
        85
    kaneg  
       134 天前 via iPhone
    只有最后一位是 x 的人才能体会其中的不便之处,其他人是根本意识不到的。理论上有超 1 亿人会遇到这个问题,但又只占总人口的 1/11 ,所以也只能是少数服从多数。从技术角度来说可以统一再增加一位,消除字母。
    xiangyuecn
        86
    xiangyuecn  
       134 天前
    如果能用 11 ,那就完全能用 36 ,A-Z 全用上,校验效果岂不更屌。

    只能用恶臭来形容(又想起了 GCJ-02 )。

    简直臭不可闻😂
    blankmiss
        87
    blankmiss  
       134 天前
    @xiangyuecn big 胆
    xiangyuecn
        88
    xiangyuecn  
       134 天前
    @blankmiss 别说,还真有。。。研究了半天,原来他们讨论的是因为质数😂



    0-9 A-Z 里面顺带去掉那些容易混淆的字符
    Opportunity
        89
    Opportunity  
       134 天前
    @xiangyuecn 在作为纳税人识别号的时候,它确实是 BASE34
    Darkatse
        90
    Darkatse  
       134 天前 via Android
    @xiangyuecn 31 可以,但是 36 肯定不行。36 不但是
    Darkatse
        91
    Darkatse  
       134 天前 via Android
    @xiangyuecn 36 不但是合数,更是过剩数。校验位选择不是越多越好的。
    dream7758522
        92
    dream7758522  
       134 天前 via Android
    提供一个思路,当最后一位是 x 时,用 0 表示。
    polo3584
        93
    polo3584  
       134 天前
    @dream7758522 那如果最后一位是 0 呢。。。
    Huelse
        94
    Huelse  
       134 天前
    @teasick #18 因为当初的考量就认为这些信息不算隐私,你从哪来就是从哪来,不必遮遮掩掩
    Devilker
        95
    Devilker  
       134 天前
    反正 10 亿 已经泄露 X 不 X 没啥意义
    ryh
        96
    ryh  
       134 天前
    校验位过于强大也反倒可以 从打码少的的号码,反推出完整号码😂 视频和文章里都见过只遮挡几位的
    gengchun
        97
    gengchun  
       134 天前
    这个不是简单的好坏的设计。

    隐私的,和难以输入这些的其实还是没有理解这个东西的用户不是个人甚至不是大部分需要对个人身份进行确认的组织。

    很多场合其实是滥用了身份证号。这个和美国社保号被各种滥用是一样的。当时怎么考虑的,具体原因不是很清楚。但现在看,这个东西设计的太容易输入也不是什么好事。所以很可能是故意的设计,就是要限制使用范围。

    @zxCoder 你直接瞎写就好了嘛。现在就是真的需要查的地方,哪个不是直接刷的,哪有让人手写的。让人手写的都是自己瞎搞出来的。
    putaosi
        98
    putaosi  
       134 天前 via iPhone
    @kop1989smurf
    @Huelse 但感觉太长了,完全可用算法缩短
    cysong
        99
    cysong  
       134 天前
    @stephenyin 罗马数字的 10
    cysong
        100
    cysong  
       134 天前
    如果只是校验输错的情况,用 11 和用 10 ,错的都是错的,对的都是对的,没有区别
    这里跟质数没什么关系
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2840 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 60ms · UTC 14:55 · PVG 22:55 · LAX 06:55 · JFK 09:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.