菜单

美国社会安全号码格式:九位数字与从不发放的号段

美国社会安全号码是九位纯数字,书写时习惯分成三段,其中若干号段从未发放过。本文讲清分段写法、保留号段规则,以及为什么它既不是身份证也不该被当成身份凭证。

发布于

  • 身份信息
  • 测试数据

美国社会安全号码是美国最常被误当成身份凭证的一串数字,它的格式其实非常简单:九位、纯数字、书写时分三段。麻烦的部分不在格式,而在于哪些号段根本不发放、以及它到底能不能证明一个人是谁。读完这篇,你能写出一份不误伤合法号码的校验规则,也能明白为什么把自己的号码随便交出去是一件危险的事。

九位数字为什么写成三段

这串号码一共九位,全部是数字,没有字母,也没有校验位之外的附加符号。习惯的书写方式是三段:前面三位、中间两位、后面四位。中间用短横线隔开,只是为了方便人眼核对,录入系统时通常会去掉短横线,只保留九位数字。

这三段各有名称:前一段是地区号,中间一段是分组号,最后一段是序列号。历史上地区号与发放地点有关,分组号与序列号则像流水号一样按顺序发下去。今天这套含义已经变了,后面会讲到,但名称一直沿用下来。

对表单来说,最稳妥的录入方式是接受带短横线与不带短横线两种写法,保存时统一成一种形态。同一串号码因为多了一个短横线就被判为无效,是这类字段最常见的假报错。

哪些号段从来不会发放?

有一些组合从来不会出现在真实号码里,记住它们能挡住明显编造的值。地区号里的三个零、六六六,以及从九零零到九九九这一段,都不曾发放;分组号的两个零与序列号的四个零同样从不出现。下表把这几种情况列在一起:

段落 从不发放的值 说明
地区号 三个零 用于占位,不作为真实号段
地区号 六六六 历史上被保留,未投入使用
地区号 九零零到九九九 从未分配的号段区间
分组号 两个零 该位置不会取这个值
序列号 四个零 该位置不会取这个值

这张表的价值在于它足够短:校验时先把带短横线的写法去掉,再检查位数、检查是否全为数字、最后检查这三个位置有没有落在上面这些值上,就已经覆盖了绝大多数肉眼可见的错误。

随机分配之后,号码里的数字还表示什么?

早年的做法是按发放地点分批启用地区号,所以前三位曾经能大致对应到申请时所在的州。这个关联在多数年份里也只是「申请地点」而非「出生地」,而且同一个号段会被大量人共用,用它来推断一个人的来处从来就不牢靠。

后来改成随机分配以后,连这层微弱的关联也没有了。地区号不再代表发放地点,分组号与序列号也不再按表面顺序递增。换句话说,同一份数据里出现两个相邻的号码,并不能说明这两个人有什么关系,也不能说明谁先申请。任何声称能从这串数字读出户籍或出生年份的说法,都是把过时的规则当成常识在传播。

这也是为什么测试数据里刻意构造的「看起来合理」的号码并不比随机号码更有价值:既然真实世界里号码与人的属性已经脱钩,测试也就没有必要去模仿那套早已失效的对应关系。

它为什么不是身份证

这串号码最初是为记录收入和发放福利而设的编号,它不是一张证件,不带照片,也没有签发机关背书的身份声明。在很多场合它被要求出示,只是因为它是唯一一个覆盖面足够广的长期编号,并不代表它可以用来确认站在面前的人是谁。

真正需要核对身份的场合,依赖的是另外一整套材料与流程,而不是一个数字是否「查得到」。因此拿它去证明年龄、证明居住地、或者证明某个人有资格签署某份文件,在逻辑上都是不成立的。这里也有一条所有测试数据都适用的底线:由程序合成出来的号码只用于测试与演示,它不能让任何人冒充一位真实存在的公民,也不能用来通过实名核验或者开启需要真实身份的账户。

有人用这串数字当密码,问题出在哪?

把号码当成密码或者安全问题的答案,是这类数据泄露危害被放大的主要原因。密码可以换,编号不能换;一个人一生只对应一个号码,一旦泄露就无法通过「重新申请一个」来止损。

另一个问题是它的流通范围远远超出人们的想象:银行、雇主、医疗机构、学校都可能留存过它,任何一处保管不严都会形成长期风险。正因为如此,在需要收集它的业务里,最小化与访问日志是比「谁会看到」更值得关注的事情。

收集和展示这串数字时要注意什么?

如果业务确实需要这个字段,有几件事值得提前定下来。展示时要不要显示完整值,还是只显示末几位;复制与导出时是否要单独记录一次访问;日志里是否要脱敏。这些决定不改变号码本身,却决定了它泄露时的影响范围。

填写环节还有一处务实的考量:很多人对自己的号码并不熟练,容易写错或者漏一位。允许粘贴、允许带分隔符、并在提交前做一次形态检查,比事后再让用户回来改要友好得多。真正需要警惕的是把它当成身份确认的答案,而不是把它当成一个普通的输入项。

给开发者:校验到什么程度就够了

针对这个字段,值得做的检查其实只有三类。第一类是形态检查:去掉分隔符之后是不是九位、是不是全是数字。第二类是保留段检查:上面那张表里的几种值应当被拒绝。第三类是展示一致性检查:同一批数据里不要出现重复号码,否则下游按号码去重时会静默合并两条记录。

不值得做的是过度推断。不要用前三位去判断出生地,也不要试图从号码序列里推算年龄或申请年份,这些关联早已被随机分配取消。同样不要做的一件事是引入所谓的官方名单去比对:就算某个号码通过了格式与保留段检查,也不能据此认为它属于某个人,格式合法与身份真实是两件完全不同的事。

在测试数据里,正确的做法是自己生成号码,永远不要粘贴一个真实号码当样本,哪怕只是用来跑一次表单。真实号码一旦进入仓库的历史记录,清理成本会一直跟着这个项目。为什么合成数据比「把真名删掉」更安全,可以延伸阅读合成数据与匿名化的区别;如果你的测试覆盖多个国家,各国身份证号长度那篇讲了字段设计上的通用做法。

下一步

如果你正在给表单写这个字段的校验,先把上面那张保留段表做成固定用例跑一遍,再用身份信息生成器选美国批量生成一批号码放进测试环境,避免任何真实号码进入仓库。需要更广的样本时,英国或日本的国家页可以帮助你确认跨国字段的差异。

继续阅读

在线身份与测试数据生成器相关文章