每个 IBAN 在国家代码之后都有两位校验位,用 MOD-97 算出。许多国家还在 BBAN(即本国账号)中加入了自己的校验位。其中大多数比 IBAN 还要早:在 IBAN 出现之前,银行就用它们来发现国内账号中的输入错误;IBAN 把这些账号包装进来时,也把它们保留了下来。
两层校验
以法国示例 IBAN FR14 2004 1010 0505 0001 3M02 606 为例。FR 后面的 14 是 IBAN 校验位。最后两位 06 是 clé RIB,即法国的国内校验位。两者保护的对象不同:
| IBAN 校验位 | 国内校验位 | |
|---|---|---|
| 位置 | 每个 IBAN 的第 3 和第 4 位 | 在 BBAN 中,位置由各国自行规定 |
| 方法 | MOD 97-10(ISO/IEC 7064),各国相同 | 本国规则,因国而异 |
| 覆盖范围 | 整个 IBAN,包括国家代码 | 通常是银行代码、分行代码和账号 |
| 制定者 | ISO 13616 | 该国的中央银行或银行业协会 |
这两层校验相互独立。一个 IBAN 的 MOD-97 校验位可能完全正确,却通不过国内校验,例如有人把输错的国内账号包装成 IBAN,然后才计算 IBAN 校验位。反过来也会发生:把有效 IBAN 中的任意一位数字改掉,MOD-97 校验就会失败,即使国内校验仍然能通过。
主要方法
各国的国内校验看起来各不相同,但大多可以归入少数几类。
MOD 97 尾数
有几个国家在 BBAN 末尾放两位用 MOD 97-10 算出的数字,方法与 IBAN 校验位相同,只是作用于它们前面的数字。葡萄牙(NIB 校验位)、斯洛文尼亚、塞尔维亚、黑山、北马其顿、波斯尼亚和黑塞哥维那、科索沃和东帝汶都采用这种方式。
RIB 校验码
法国的 clé RIB 是这样算的:先算出 89 × 银行代码 + 15 × 分行代码 + 3 × 账号,再用 97 减去它除以 97 的余数。账号中的字母要先换成数字(A 和 J 算作 1,B、K 和 S 算作 2,依此类推)。这个校验码使整个国内账号能被 97 整除。法国和摩纳哥共用这种方法;突尼斯和毛里塔尼亚使用的 RIB 校验码目的相同:让整个账号能被 97 整除。
意大利的 CIN
意大利和圣马力诺在 BBAN 开头放一个校验字母,称为 CIN。它覆盖后面的 22 个字符:ABI 银行代码、CAB 分行代码和账号。奇数位上的字符按对照表转换,偶数位上的字符取其本身的值(数字就是数字本身,字母从 A = 0 到 Z = 25)。各值之和除以 26,余数在 0 到 25 之间,再换成 A 到 Z 中对应的字母。
西班牙的控制码
西班牙的账户代码(CCC)在分行代码和账号之间有两位控制码。第一位校验银行代码和分行代码,第二位校验 10 位账号。每一位都由一个加权和得出,权重为 1、2、4、8、5、10、9、7、3、6:先求加权和除以 11 的余数,再用 11 减去这个余数。结果为 11 时记为 0,为 10 时记为 1。参见西班牙 IBAN 格式。
加权和
许多国家把每一位数字乘以一个权重,将乘积相加,再取余数:
- 比利时:最后两位是前十位数字对 97 取模的结果(余数为 0 时用 97 代替)。
- 挪威:MOD 11,权重为 5、4、3、2、7、6、5、4、3、2。需要用到 10 这个值的账号从不发放。
- 芬兰:Luhn 算法,也就是银行卡号使用的那种算法。
- 爱沙尼亚:7-3-1 法,从右往左按 7、3、1 循环加权。
- 匈牙利:两位校验位,权重为 9、7、3、1,一位用于银行代码和分行代码,一位用于账号。
- 波兰:8 位清算代码末尾的一位校验位,权重为 3、9、7、1。
- 阿尔巴尼亚:银行代码和分行代码之后的一位校验位,权重为 9、7、3、1。
- 捷克和斯洛伐克:账号前缀和账号各自的加权和都必须能被 11 整除。
- 克罗地亚:ISO 7064 MOD 11,10,银行代码和账号各算一次。
- 哥斯达黎加:客户账号的最后一位,权重先是 1 到 9,再是 1 到 7,对 11 取模。
- 俄罗斯:俄罗斯银行规定的控制码,用权重 7、1、3 对 BIK 银行代码的末几位和账号进行计算。
逐国一览
下表列出了本站计算国内校验位的每个国家,以及这些校验位在 IBAN 中的位置。点击国家链接,可以打开该国的生成器和完整格式。
| 国家 | 位置 | 方法 | IBAN 校验位 | 来源 |
|---|---|---|---|---|
| 阿尔巴尼亚 | 12 | 权重 9、7、3、1(模 10) | 因账户而异 | Bank of Albania, Decision No. 26 of 4.5.2022 |
| 爱沙尼亚 | 20 | 7-3-1(模 10) | 因账户而异 | Estonian Banking Association (Pangaliit) |
| 北马其顿 | 18–19 | MOD 97-10 |
MK07
|
National Bank of the Republic of North Macedonia |
| 比利时 | 15–16 | 前 10 位对 97 取模 | 因账户而异 | Febelfin / National Bank of Belgium |
| 波兰 | 12 | 权重 3、9、7、1(模 10) | 因账户而异 | Narodowy Bank Polski |
| 波斯尼亚和黑塞哥维那 | 19–20 | MOD 97-10 |
BA39
|
Centralna banka Bosne i Hercegovine |
| 东帝汶 | 22–23 | MOD 97-10 |
TL38
|
Banco Central de Timor-Leste |
| 俄罗斯 | 22 | 控制码,权重 7、1、3 | 因账户而异 | Bank of Russia, Procedure No. 515 of 8.9.1997 |
| 法国 | 26–27 | clé RIB(模 97) | 账号只含数字时为 FR76 | CFONB, RIB standard (Banque de France) |
| 芬兰 | 18 | Luhn(模 10) | 因账户而异 | Finance Finland (Finanssiala) |
| 哥斯达黎加 | 22 | 权重 1 到 9(模 11) | 因账户而异 | Banco Central de Costa Rica, Cuenta Cliente |
| 黑山 | 21–22 | MOD 97-10 |
ME25
|
Centralna banka Crne Gore |
| 捷克 | 14、24 | 加权 MOD 11 | 因账户而异 | Česká národní banka, vyhláška č. 169/2011 Sb. |
| 科索沃 | 19–20 | MOD 97-10 |
XK05
|
Central Bank of the Republic of Kosovo (BQK) |
| 克罗地亚 | 11、21 | ISO 7064 MOD 11,10 | 因账户而异 | Hrvatska narodna banka, Narodne novine 13/2025 |
| 毛里塔尼亚 | 26–27 | RIB 校验码(模 97) |
MR13
|
Banque Centrale de Mauritanie, Instruction 16/GR/2008 |
| 摩纳哥 | 26–27 | clé RIB(模 97) | 账号只含数字时为 MC58 | CFONB, RIB standard (Banque de France) |
| 挪威 | 15 | MOD 11 | 因账户而异 | Bits AS / Finans Norge |
| 葡萄牙 | 24–25 | MOD 97-10 |
PT50
|
Banco de Portugal, NIB |
| 塞尔维亚 | 21–22 | MOD 97-10 |
RS35
|
Narodna banka Srbije |
| 圣马力诺 | 5 | CIN 校验字母(模 26) | 因账户而异 | Banca Centrale della Repubblica di San Marino (ABI standard) |
| 斯洛伐克 | 14、24 | 加权 MOD 11 | 因账户而异 | Národná banka Slovenska, opatrenie č. 8/2009 |
| 斯洛文尼亚 | 18–19 | MOD 97-10 |
SI56
|
Banka Slovenije, Uradni list RS 85/2016 |
| 突尼斯 | 23–24 | RIB 校验码(模 97) |
TN59
|
Banque Centrale de Tunisie |
| 西班牙 | 13–14 | 控制码(模 11) | 因账户而异 | Consejo Superior Bancario, Código Cuenta Cliente (AEB/CECA) |
| 匈牙利 | 12、28 | 权重 9、7、3、1(模 10) | 因账户而异 | Magyar Nemzeti Bank, 35/2017. (XII. 14.) MNB rendelet |
| 意大利 | 5 | CIN 校验字母(模 26) | 因账户而异 | ABI, coordinate bancarie (Banca d'Italia) |
还有几个国家,例如布隆迪、吉布提以及圣多美和普林西比,从注册表示例来看也有国内校验,但我们没有找到官方说明。生成器会随机填写这些位。
固定的 IBAN 校验位
MOD 97 尾数或 RIB 校验码会让 BBAN 除以 97 的余数始终相同,与具体账户无关。IBAN 校验位只取决于这个余数和国家代码,因此这些国家的所有有效 IBAN 都有相同的校验位:所有葡萄牙 IBAN 都以 PT50 开头,所有塞尔维亚 IBAN 都以 RS35 开头,所有突尼斯 IBAN 都以 TN59 开头。账号只含数字的法国 IBAN 都以 FR76 开头。法国账号中出现字母时,结果会随之改变,所以上面的注册表示例以 FR14 开头。
读到这些国家的 IBAN 时,这是一个方便的快速检查:校验位不是这个值,就说明 IBAN 有误。
验证程序应该检查它们吗?
MOD-97 已经能发现任何一位数字的错误,以及任何两个相邻数字的颠倒,所以国内校验对防范输入错误帮助不大。它们在其他情况下有用:有人用错误的国内账号手工拼出 IBAN,或者有人伪造 IBAN 时只算了 MOD-97 校验位。
在您自己的验证程序中加入国内校验之前:
- 每个国家都需要单独的算法,而且每种算法都必须严格遵循官方规则。实现有误会拒绝真实客户的 IBAN,这比不检查还糟。
- 用真实格式的示例测试每种算法,例如每个国家页面上的注册表示例。
- 错误提示要具体。对用户来说,“国内校验位不匹配”比“IBAN 无效”更有帮助。
我们的 IBAN 验证器会在规则已知时核对国内校验位,规则未知时也会说明。开源库 iban-check 负责结构检查和 MOD-97 校验。
用国内校验位做测试
生成器在仿真模式和完全随机模式下,都会为上表中的每个国家计算国内校验位,因此会核对这些校验位的验证程序也会接受生成的 IBAN。做负向测试时,改动其中一位国内校验位,再重新计算 IBAN 校验位:这样 IBAN 能通过 MOD-97 校验,却无法通过国内校验。IBAN 校验位有误时,验证器会给出与之匹配的正确校验位。面向开发与 QA 的测试 IBAN 一文介绍了验证程序检查的其他各层。
资料来源
- SWIFT IBAN 注册表第 102 版(2026 年 6 月):各国的 BBAN 结构,以及上文使用的示例。
- ISO/IEC 7064:MOD 97-10 和 MOD 11,10 校验字符系统。
- 捷克国家银行:IBAN:关于捷克账号及其校验的第 169/2011 号法令。
- 35/2017. (XII. 14.) MNB rendelet,附件 1:匈牙利的账号及其校验位。
- 表中列出的各国资料来源:中央银行、银行业协会及其发布的标准。