IBAN 中的国内校验位

许多国家在账号中保留了自己的校验位,从法国的 clé RIB 到意大利的 CIN。它们怎么算,和 IBAN 校验位又有什么不同。

更新于

每个 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 一文介绍了验证程序检查的其他各层。

资料来源

需要测试 IBAN?

为 91 个国家中的任意一个生成有效 IBAN,按需要的格式复制,并查看每一部分的含义。

打开生成器