雇主身份识别号(EIN)和社会保障号(SSN)都是九位的美國標识符,并且都可能出現在同一個表单里——但它们由不同的機构签發,遵循不同的格式,承担着差异极大的法律权重,并需要不同的校驗逻辑。本文将带你梳理對開發者而言真正重要的差异:格式、校驗、產生安全的測試夹具,以及哪种標识符应放在哪個表单欄位中。
一段話总結
SSN 用于標识個人,由社会保障管理局(SSA)签發。EIN 用于標识商業實体,由美國国税局(IRS)签發。两者都是九位數字,但 EIN 写作 XX-XXXXXXX,SSN 写作 XXX-XX-XXXX。两者作為原始 9 位字符串都看似合理,这也是為什么格式(以及其背后的签發機构校驗)是在代碼中区分它们的最簡单方式。
SSN——結构與规则
SSN 遵循 AAA-GG-SSSS 格式,由三部分組成:
- 地區號(AAA):最初與签發州相關,部分区间被保留未分配。000、666 以及 900–999 不会被分配。
- 組号(GG):在同一地區號内按記錄在案的升序模式签發。00 这一組永远不会使用。
- 序列号(SSSS):0001–9999,在一組内顺序遞增。
最重要的實操准则是:某些地區號是被保留的,永远不会分配给真實個人。對測試資料最有用的区间是 900-99-XXXX 到 999-99-XXXX,它们在历史上用于促销用途并至今未被使用。我们的 SSN 測試格式產生器 即使用这些保留地區號,确保輸出能匹配你的正则、但無法通過真實 SSA 校驗。
EIN——結构與规则
EIN 遵循 XX-XXXXXXX 格式:
- 前綴(XX):最初與签發该號碼的 IRS 校区绑定。2001 年之后,前綴可用来判断签發分局,但并不严格對应公司的所在地。
- 序列号(XXXXXXX):一個顺序遞增的 7 位值。
與 SSN 不同,EIN 没有公開的"測試保留"区间,因此產生假 EIN 的目標是產出一個匹配格式的 9 位值;如果你的應用要识别 IRS 分局,可以带一個看起来真實合理的签發前綴。使用 EIN 產生器 可輸出外观合理的合成 EIN,且永远不会與真實企業冲突。
對比表
| 屬性 | EIN | SSN |
|---|---|---|
| 签發機构 | IRS | SSA |
| 標识對象 | 商業實体 | 個人 |
| 格式 | XX-XXXXXXX | AAA-GG-SSSS |
| 位数 | 9 | 9 |
| 測試保留区间 | 無官方区间 | 900–999 地區號 |
| PII 敏感度 | 高(企業) | 非常高(個人) |
| 儲存监管 | 视上下文而定 | 强监管(GDPR、CCPA、IRS Pub 1075) |
正则校驗
能分别接受两种標识符风格的纯格式正则:
// EIN:XX-XXXXXXX(或以非零開头的 9 位連续數字)
const EIN_RE = /^\d{2}-\d{7}$/;
// SSN:AAA-GG-SSSS,地區號需排除 000/666/900-999
const SSN_RE = /^(?!000|666|9\d\d)\d{3}-(?!00)\d{2}-(?!0000)\d{4}$/;
注意 SSN 模式中的负向先行断言。它们会拒绝从未签發的区间,因此基于此模式的校驗器会接受真實 SSN(以及保留地區號的測試 SSN,取决于你劃定的邊界)并拒绝明显的無效輸入。在測試中你往往想要相反的結果——只接受 900–999 保留区间——从而可以确保不会有任何真實 SSN 進入预發資料函式庫。把先行断言反轉過来:
// 仅測試 SSN:AAA 必须為 900-999,GG != 00,SSSS != 0000
const TEST_SSN_RE = /^9\d{2}-(?!00)\d{2}-(?!0000)\d{4}$/;
带自动识别的 JavaScript 校驗器
function classifyIdentifier(value) {
const v = String(value).replace(/\D/g, "");
if (v.length !== 9) return { type: null, error: "must be 9 digits" };
const fmt = `${v.slice(0, 2)}-${v.slice(2)}`;
if (EIN_RE.test(fmt)) {
return { type: "EIN", formatted: fmt };
}
const ssn = `${v.slice(0, 3)}-${v.slice(3, 5)}-${v.slice(5)}`;
if (SSN_RE.test(ssn)) return { type: "SSN", formatted: ssn };
return { type: null, error: "format mismatch" };
}
这是最安全的自动识别方式。真實 SSN 與 EIN 都能通過格式校驗;在表单中收集哪一种輸入是业务决策,不是解析技巧。
何时在表单中使用哪一個
使用 SSN 欄位的場景……
- 你出于信贷、雇佣或代扣税款目的向個人採集(例如薪金入职、租户审查、贷款申请)。
- 你的合规团隊已明确授权 SSN 儲存,并配備相应的加密、访问控制和文档化的資料留存策略。
使用 EIN 欄位的場景……
- 你要将一家企業作為客户、商户或分包商入驻(W-9 採集、B2B SaaS 註冊、支付處理方 KYB)。
- 你需要就该實体向 IRS 报送 1099-MISC 或 1099-NEC。
绝對不要把两者混入同一欄位
一個会静默接受 SSN 或 EIN 任一的"Tax ID"輸入是一個 UX 陷阱——表单将不知道该套用哪條合规规则,你的資料团隊也無法判断一條記錄究竟是人還是企業。请使用分開的輸入欄位。
為測試產生安全的假資料
指引用法是:測試資料必须永远不能通過真實系统的校驗。對 SSN 而言,这意味着从 SSA 公開确認未使用的 900–999 地区区间中抽取。對 EIN 而言没有對应的 IRS 规则集,因此你的表单接受的每一個 EIN 都可能是真實企業標识符——切勿把隨機產生的 EIN 存入会呼叫 IRS 或第三方 KYB 厂商的系统中。
// 拉取安全的測試 SSN
fetch("/us-address/api/v1/ssn?count=10", {
headers: { Authorization: `Bearer ${KEY}` }
})
.then(r => r.JSON())
.then(res => res.data); // 10 個保留区段 SSN
// 拉取合成 EIN(仅匹配格式)
fetch("/us-address/api/v1/ein?count=10", {
headers: { Authorization: `Bearer ${KEY}` }
})
.then(r => r.JSON());
这两类輸出在你的表单看来都可信并能通過你的正则,但 SSN 值無法通過真實 SSA 校驗,EIN 值则是隨機字符串,几乎不会與真實企業冲突。
值得了解的合规要點
如果你的應用会儲存任一种標识符,你很可能受以下具体法规约束:
- GLBA 及各州資料泄露法在许多法規辖区把 SSN 與 EIN 都视為個人信息。
- IRS Publication 1075 规定了联邦税务信息(包括 SSN)的處理规则。
- GDPR:任何国籍的 SSN 都屬特殊类别個人資料,需要合法依据并按設计進行保护。
- PCI DSS 并不直接约束 SSN/EIN,但如果其中任一標识符與持卡人資料并存,合规範圍就会扩大。
在上線採集 SSN 或 EIN 的表单之前,请與法务與安全团隊确認儲存、加密、访问日志與留存策略已文档化。如果還没就绪,你可以產生測試資料并搭建表单,但在它们就绪之前不要切换到生產儲存。
总結
開發者的精簡版要點:SSN 標识個人、EIN 標识企業,两者均為 9 位數字但格式不同,两者都屬敏感資料——但 SSN 受到的监管严格得多。请分開校驗、分開採集到不同欄位;測試时从 SSA 的 SSN 保留区间(通過 SSN 測試格式 工具)與仅匹配格式的合成 EIN(通過 EIN 產生器)中取值。如此便能让你的夹具覆蓋每一條正则分支,而又绝不会冒触及真實個人資料的風險。