IBAN生成器测试

按 ISO 13616 拆解 IBAN 的三段结构,用 mod-97 算法生成带正确校验位的测试号码、也能反过来校验粘贴进来的号码,全部在本机完成。生成的号码仅供软件测试与文档示例,不能用于真实银行交易。

DE89 3704 0044 0532 0130 00
当前国家DE
IBAN 总长22 位
本次生成5 条
mod-97 自检全部 = 1
—

国家下拉框与数量框是单行控件,按 Enter 触发生成;校验框同样是单行,粘贴号码后按 Enter 即校验。生成的号码只保证「结构与校验位自洽」,不对应任何真实账户。

使用方法

  1. 在国家/地区下拉框选一个(默认 DE 德国(22 位)),括号里的数字是该国 IBAN 的总长度,长度由 ISO 13616 登记表固定,不能自选。
  2. 在生成数量填 1~50 的整数,默认 5 条。
  3. 按 Enter 或点「生成 IBAN」。结果区给出按每 4 位分组的号码,例如 DE89 3704 0044 0532 0130 00,每条都自带正确的 mod-97 校验位。
  4. 看结果区下方的mod-97 自检:显示「全部 = 1」说明本次生成的每一条都通过了 ISO 7064 MOD 97-10 校验;若有任何一条不等于 1,说明生成逻辑出错。
  5. 把要核对的号码粘进校验单个 IBAN 框(默认就是那条公开测试号),按 Enter 或点按钮,结果框会给出「有效」或具体原因(长度不符、mod-97 不等于 1、含非法字符等)。

这个IBAN生成器测试能解决什么问题

一是给开发和测试造数据。写支付、对账、Swift 报文相关的程序时,测试库里需要一批「结构合法但不指向真实账户」的 IBAN。手工编的号码十有八九校验位是错的,校验函数一测就红;用本页生成,校验位是用同一套 mod-97 公式算出来的,能确定地通过格式校验。

二是反向核对别人给的号码。收到一份号称来自海外的 IBAN,先看长度对不对、再看 mod-97 是不是 1,十秒钟就能筛掉绝大多数手抄错误。mod-97 能挡住的是「打字打错一位」这类错误,挡不住整段伪造——这一点后面会讲清。

三是理解 IBAN 到底由什么组成。很多人把 IBAN 当成一个长长的账号,其实它是「2 位国家码 + 2 位校验位 + 国家自定的 BBAN」三段。拆开之后,做界面校验、填正则、写数据库字段长度时就知道该约束哪一段。

四是给文档和截图准备脱敏样例。产品文档里需要展示 IBAN 的示例,用真实号码有泄露风险,用本页生成的测试号既格式正确又不对应真实账户,还标注了「仅测试」。

这个IBAN生成器测试不做真实转账、不做账号归属查询,也不验证账户是否存在——IBAN 的校验位只证明「号码自身没打错」,不证明账户存在。要校验银行卡号的 Luhn 校验位请用「银行卡号校验」,要生成 SWIFT/BIC 代码请用「虚拟SWIFT代码生成器」。

原理与规则说明:IBAN 三段结构与 mod-97 算法

结构:IBAN = 2 位国家码 + 2 位校验位 + BBAN。国家码取 ISO 3166-1 alpha-2(DE、GB、FR…);校验位是两位数字 00~98;BBAN(Basic Bank Account Number)由国家自定,长度和字符集都不一样,德国是 18 位纯数字,英国是 18 位字母数字混合,爱尔兰的 BBAN 前四位是银行代码字母。所以 IBAN 总长只由前两位决定:DE=22、GB=22、FR=27、NL=18、ES=24、IT=27、CH=21、BE=16、AT=20、IE=22、PL=28、AE=23,范围从 15 位(NO 挪威)到 34 位不等。

校验算法:ISO/IEC 7064 MOD 97-10。三步:① 把 IBAN 的前四位(国家码 + 校验位)整段搬到字符串末尾,得到 BBAN + 国家码 + 校验位;② 把所有字母按 A=10、B=11 … Z=35 换成一到两位的数字,得到一串纯数字;③ 对这串数字整体取模 97,结果必须等于 1。示例 DE89 3704 0044 0532 0130 00 去空格后重排成 370400440532013000DE89,字母替换后是 370400440532013000131489,对 97 取模恰好等于 1,所以它有效。

校验位怎么算出来。生成时反过来用同一个公式:把 BBAN 后面拼上国家码和占位的 00,即 BBAN + DE + 00,对这串取模 97 得到 m,校验位就是 98 − m;若结果小于 10 就补一个前导零。以德国示例的 BBAN 370400440532013000 为例,mod97(370400440532013000DE00) = 9,于是校验位 = 98 − 9 = 89,组装出 DE89…。这正是本页默认示例的来历。

为什么用 97 这个模数。校验位只有两位数字(00~98),要能检测出「单个数字打错」「相邻两位写反」这两类最常见的抄写错误,模数必须与 10 互素且足够大。97 是小于 100 的最大素数,能覆盖 00~98 全部取值,且对调位、单字符错位的检出率接近 100%(这类系统叫 ISO 7064 混合系统,同一套规则也用在中国的统一社会信用代码里)。

大整数怎么取模。IBAN 替换字母后最长会到 30 位以上数字,超出 JavaScript 安全整数范围,所以不能直接 parseInt 再取模。本页用逐位累乘:r = (r * 10 + 当前数字) % 97,一位一位滚动,永远只处理小于 97×10 的值,既不丢精度也不需要 BigInt。

完整示例(数值仅作演示)

与页面打开时的默认值一致:国家 = DE(德国,22 位),生成数量 = 5 条,校验框 = DE89 3704 0044 0532 0130 00。IBAN生成器测试给出的下面每一个数字都由复算脚本实测,不是手写的:

下表是 18 个国家的长度与示例(示例均为按公式生成的测试号,仅 DE/GB 两条为公开标准示例):

国家码IBAN 总长BBAN 长度示例(测试)IBANmod-97
DE 德国2218DE89 3704 0044 0532 0130 001
GB 英国2218GB82 WEST 1234 5698 7654 321
FR 法国2723FR14 2004 1010 0505 0001 3M02 6061
NL 荷兰1814NL91 ABNA 0417 1643 001
ES 西班牙2420ES91 2100 0418 4502 0005 13321
IT 意大利2723IT60 X054 2811 1010 0000 0123 4561
CH 瑞士2117CH93 0076 2011 6238 5295 71
BE 比利时1612BE71 0961 2345 67691
AT 奥地利2016AT92 1904 3002 3456 78901
IE 爱尔兰2218IE29 AIBK 9311 5212 3456 781
PL 波兰2824PL35 1090 1001 0000 0000 0000 00121
AE 阿联酋2319AE07 0331 2345 6789 0123 4561

输入范围与对照表

各字段的范围与填错时的动作,右列是结果区会显示的具体提示:

字段/情况允许范围超限或填错时的动作
生成数量1~50 的整数空值、0、负数、超过 50 均拒绝,并报出当前填的值与允许区间
生成数量为小数不接受提示「必须是整数条」,不四舍五入代替用户决策
国家码下拉框内 18 项只能选预设项;无该国家长度信息时拒绝并提示「未收录该国家长度」
校验输入为空必填提示「校验框为空」,不静默返回「无效」
校验输入含非法字符只允许 A-Z 0-9 与空格报出第一个非法字符及其位置,例如「第 5 位出现 $」
长度不符按国家码固定先于 mod-97 报错,给出「应为 N 位、实际 M 位」
mod-97 不等于 1必须为 1报出实际模数,例如「结果 = 28」

两种校验手段能挡住什么、挡不住什么,容易混淆,单独列一张表:

检查项能发现不能发现
长度检查漏抄、多抄、少一位位数对但内容错
mod-97 校验位单字符抄错、相邻两位写反整段被伪造、账户是否真实存在
国家码前缀不属于 ISO 3166 的两位字母国家存在的账户结构差异(各 BBAN 规则不同)

输入范围、边界与精度说明

常见问题

校验通过是不是说明这个 IBAN 真实存在?

不是。mod-97 只验证「号码本身有没有抄错」,它是一道校验位算术,任何按公式拼出来的号码都能通过。伪造者只要改了 BBAN 再重算校验位,同样能造出「校验通过」的号码。所以校验通过只能排除手抄错误,账户是否存在必须由银行系统查询。这也是本页强调生成结果仅供测试的原因。

为什么德国的 IBAN 是 22 位、挪威只有 15 位?

因为 BBAN 的长度由国家自己定。IBAN 总长 = 4 + BBAN 长度,德国 BBAN 18 位得到 22,挪威 BBAN 11 位得到 15。各国银行体系的历史结构不同,ISO 13616 只是把长度登记下来统一约束,并不强求一致。做法是「先读国家码,再按登记表取长度」,不能用一个固定正则套所有国家。

国家码写反了(比如 DE→ED)会怎样?

会直接被判无效。示例里把 DE89… 写成 ED89…,重排取模得到 7 而不是 1。因为国家码参与了字母到数字的替换,顺序一变整串数字就变了。顺带一提,ED 也不是 ISO 3166 登记的国家码,两层检查都会拦住它。

为什么不能只算校验位、跳过长度检查?

能过 mod-97 的号码仍然可能长度不对,比如把德国号码少抄一位后凑巧重算校验位。长度检查成本极低、能挡掉一类错误,所以本页把它放在 mod-97 之前执行:先看总长对不对,再看模数是不是 1,最后才给「有效」。报错时也会分别说清是长度问题还是校验位问题,避免只给一句「无效」。

生成器用随机 BBAN,会造出重复号码吗?

理论上可能,但概率极低:德国 BBAN 有 18 位数字,随机空间约 10¹⁸,一次生成 50 条撞号的概率可以忽略。对测试数据而言即使重复也无妨;若你的用例要求全局唯一,生成后按字符串去重即可,本页不做去重是因为那会掩盖生成逻辑本身的正确性。

BigInt 能做吗,为什么本页没用?

能做,BigInt 对任意长度整数都精确。但纯数字逐位取模不需要大整数,几十位以内的取模用 r = (r * 10 + d) % 97 一行就够,且兼容所有浏览器、不引入大整数对象的内存开销。只有在需要做大量大数运算(比如金融精算)时才值得引入 BigInt。

和 SWIFT/BIC 代码是什么关系?

两者是跨境汇款里的两个不同标识:IBAN 标识「收款人的哪一个账户」,通常 15~34 位、含国家码与校验位;BIC(也叫 SWIFT 代码)标识「哪家银行/分行」,固定 8 或 11 位字母数字。一笔汇款常常同时需要两者。本页只管 IBAN,BIC 请用「虚拟SWIFT代码生成器」。

生成的号码能直接拿去测试真实接口吗?

可以用于测试你自己系统的格式校验、界面展示、CSV 导入等环节;但不要把它发给任何真实银行或支付网关当作有效账号。如果对接的是沙箱环境,优先使用该机构官方提供的测试 IBAN(例如 DE89 3704 0044 0532 0130 00 就是广泛使用的公开测试号),因为它们可能与沙箱里的虚拟账户绑定。

相关工具