Command Palette

Search for a command to run...

Luhn算法:信用卡验证是如何工作的

Luhn算法:信用卡验证是如何工作的

T
Toolz Team
|Sep 13, 2026|16 最小读数
Google 上的首选 Toolz.dev

安全集合的一部分

信用卡验证器

Luhn校验和检查信用卡号码,并检测其卡网络。仅验证格式,切勿联系银行。

用信用卡验证器

我建造 Toolz.dev(而在此之前),我花了数年时间运送 WordPress 插件和 Laravel API,其中有几款必须进行付款,我写过的第一份结账表将每个错误输入的卡号直接发送到支付网关,等待它反弹,从技术上讲,它很慢,并且它烧毁了网关请求中原本不可能有效的号码。修复的小得令人尴尬:在提交之前在浏览器中运行 Luhn 校验和。那个更改立即捕获了大多数错别字,并停止了一流的无意义的 API 调用。本指南是关于那个检查、旁边坐的前缀规则以及 信用卡验证器 我构建了这样你就永远不必从记忆中重新实现。

TL;博士: A信用卡验证器确认一个号码在结构上是正确的,而不是它属于真实账户,它运行两个独立的测试:ISO/IEC 7812-1的Luhn校验和,几乎捕获每个个位数的错别字和相邻的转置,以及针对每个网络's发布的发行人范围的长前缀检查,一个号码可以通过一个,另一个失败,因此两个结果是单独报告的,它完全在你的浏览器中运行,所以从来没有上传过卡号,它永远不能告诉你卡上是否有钱,只有发行人知道这一点。

卡号有效是什么意思?

支付卡号码,正式名称为主账户号码或 PAN,不是随机的数字串。它的结构由 定义 ISO/IEC 7812.前六至八位是发行人识别号,或称IIN,过去称为银行识别号(BIN),那些数字标识网络和发行银行,之后直到倒数第二位的数字是个人账户标识符,最后一位是用Luhn算法计算的校验位。

So "valid"有两个独立的含义,它有助于保持它们分开,第一个是数字服从Luhn校验和,意味着校验位与数字的其余部分一致,第二个是数字的长度和前缀正确,对于一个真正的卡网络,一个数字可以满足一个条件,而不是另一个条件。 4111 1111 1111 1112 visa前缀和一个visa长度但无法通过luhn,一个随机的十六位字符串恰好以右校验位结束,通过luhn,但可能以一个前缀开始没有网络拥有一个好的验证器告诉你这两个失败了,因为每种情况下修复都不同。

check都不能做的是告诉你卡是真实的,结构有效性是关于数字的形状,而不是它背后的帐户的状态,帐户可能不存在,可能被冻结,可能超出其限制,或者可能在几年前关闭,唯一知道的系统是发行银行,它准确地回答一次,在实时交易中的授权请求中,浏览器端验证器所做的一切都是一个廉价的预过滤器,在你到达那个点之前运行。

Luhn算法是如何工作的?

Luhn算法,也叫mod-10算法,1960年由Hans Peter Luhn在IBM申请专利,现在属于公共领域,它是一个校验和,这意味着它的全部目的是检测意外错误,而不是提供任何安全性,它的工作原理是这样,从最右边的数字开始向左移动,每隔一位数字就加倍,如果加倍产生一个大于九的数字,你就从中减去九(这和把它的两位数字加在一起一样),然后你把所有的数字、加倍的和未碰到的数字加起来,如果总数能被十整除,那么这个数字就过去了。

这是检查 4111 1111 1111 1111、从右到左工作,最右边的数字是位置一,不加倍,每隔二位加倍给出一组一和二,来自加倍位置的二加起来,总和落在十的倍数上,所以数字通过改变任意一位,总和几乎总是停止为十的倍数,这正是检查有用的原因。

Luhn的值是在它捕获的东西,它检测到每一个个位数的错误,这意味着任何一个数字输入错误,它还捕获几乎每个相邻两个数字的转置,经典"我输入了21而不是12"错误,除了一个已知的例外:它没有捕获交换 09 並 90的,因为两者都映射到相同的加权总和。那是一个真正的盲点,但它是一个罕见的盲点,这是卢恩是校验和而不是加密保证的原因。对于表单验证来说,它已经足够好了,这就是为什么它基本上坐在互联网上每个结账的卡字段后面。

卡网络是如何检测到的?

数(leading digits)即 IIN 来读取网络,每个网络都拥有特定的前缀范围,而且大多数还限制了总长度,验证器首先匹配最长的、最具体的前缀,因为有些范围重叠,以下是它检查的范围:

网络 从开始 有效长度 安全码
签证 4锛屽湪娴欐睙鏉 13、16、19 3
万事达卡 51-55, 2221-2720 16绔 涔诲芥澶澧 3
美国运通 34、37 15绔 涔诲芥澶澧 4锛屽湪娴欐睙鏉
发现 6011、65、644-649、622126-622925 16、19 3
食客俱乐部 300-305、309、36、38-39 14、16、19 3
JCB 3528-3589 16-19 3
银联 62绔 涔诲芥澶澧 16-19 3
大师 50、56-69(精选) 12-19 3

重叠是有趣的部分,而弄错它们是天真的探测器如何失火。万事达卡补充道 2221-2720 2017年的范围,所以在此之前编写的检测器将那些卡片报告为未知。discover拥有狭窄的切片 62 空间, 622126 通过 622925的,而银联拥有其余部分 62所以你测试它们的顺序决定了是否是 a 6221 卡读作发现或银联验证器在宽银联前缀之前测试特定的发现窗口,因此两者都正确着陆。美国运通是跳转格式代码的。因为它使用 4-6-5 组的十五位数字,而不是通常的四组四人,并且它使用四位安全代码(正面打印的 CID)而不是背面的三位 CVV。

如何使用信用卡验证器

该工具故意简单,你粘贴一个数字并读取结果,没有提交按钮,也没有任何配置。

1步:输入数字

Type 或将卡号粘贴到字段中,空格和破折号被忽略,因此 4111-1111-1111-1111、 4111 1111 1111 1111、和 4111111111111111 all 验证相同。这很重要,因为真正的输入以每种格式到达:从电子表格复制,读出卡片,或从测试夹具中拉出。

2步:宣读判决书

Result的顶部,明明告诉你这个数字是否有效,如果没有,它会说出原因,下面,两个检查分别显示:Luhn校验和是否通过,长度是否与检测到的网络相匹配,将它们分开看就是点,一个通过Luhn但长度失败的数字几乎总是意味着一个数字被删除或添加,而一个Luhn失败但长度正确的数字通常意味着一个数字根本是错误的。

3步:检查检测到的网络

该工具显示它从前缀中识别的网络、网络允许的长度以及其安全代码应该有多长。当您正在构建表单并想要显示正确的卡徽标时,或者当您需要知道是否期望三位数或四位数的 CVV 时,这本身就很有用。

4步:复制格式化或蒙版的号码

Neng复制其网络打印方式分组的号码,或者复制一个掩盖了除后四位De每一个数字的掩盖版本,掩盖形式就是你在日志、截图、Suo持票证中想要的,因为存储或显示全PAN正是那种让人们在合规性上陷入困境De事情。

验证适合哪里,停止在哪里?

诚实的框架是验证器是一个过滤器,而不是一个门。它属于一个流程的前面,可以廉价地拒绝明显的垃圾,并且永远不能将其作为下游任何事情的证明。在结账表单中,运行 Luhn 客户端可以在用户完成打字的那一刻标记一个错字,然后他们点击付费,这是一个更好的体验,并且可以节省去网关的注定往返。在数据管道中,验证卡形字段会在损坏的行到达会窒息它们的系统之前捕获它们。在测试套件中,您需要通过验证的数字,以便表单在生产中按照其将要的方式运行,这就是已发布的测试号的用途。

它不做的是授权,这值得直言不讳。有效的号码不是工作卡。该工具无法检查余额,无法确认帐户存在,并且与任何银行没有连接。它也不能也不应该生成与真实帐户绑定的号码。它提供的样本号码是支付提供商发布的标准测试值,这些值是 Luhn 有效的,并且可以精确地通过网络检查,以便开发人员可以行使他们的表格,但哪个映射到不收费。如果您正在构建任何触及真实支付的内容,则是否可以对卡收费的实际验证将通过您的支付处理器发生在服务器端,并且卡数据本身应该被标记化,因此您自己的系统永远不会存储原始 PAN。客户端验证是礼貌的前门,而不是金库。

这与在服务器上验证相比如何?

两者都有一个地方,他们回答的问题不同。 Luhn 和前缀检查的客户端验证是即时且私密的,它在用户提交之前会给出用户反馈,这不会花费您任何费用。它的限制是它只知道结构。通过支付处理器进行服务器端验证是唯一可以确认卡是真实且收费的,但它需要网络请求,每次授权尝试可能会花费金钱,并且发生在用户承诺提交之后。明智的设计既使用:浏览器免费捕获错别字和形状错误,服务器在用户付款时进行重要的检查。跳过客户端检查会使表单感觉缓慢;跳过服务器检查意味着您从未真正验证过任何内容。如果您正在为此类工作组装更广泛的套件,则 开发人员生产力工具 roundup 涵盖了与其一起生活的其他公用事业。

相关工具和进一步阅读

卡验证器很少单独旅行,当您硬化表单或数据管道时,通常还会生成标识符、散列值以及检查其他类型的输入。 哈希生成器 当您需要对值进行指纹识别而不是验证其形状时,您会达到的目的 密码强度检查器 应用相同的"在浏览器中测量它,永远不要将其发送到任何地方"原则到凭据。在网络方面, IP子网计算器 是任何构建结账运行的基础设施的人的配套工具。

对于更广泛的背景, 数据隐私和在线工具 guide 解释了为什么运行敏感检查客户端事项以及 编码工具指南 将验证器置于开发人员其余部分的上下文中's日常套件。toolz。dev上的所有内容都在您的浏览器中运行,这也是卡号可以安全粘贴到其中的全部原因:它永远不会离开您的设备。

常见问题

Luhn算法检查什么?

Luhn算法是验证一个数字没有被错误输入的mod-10校验和,它从右边每隔二位数字加倍,从九以上的任何结果中减去九,将所有数字相加,并确认总和可以被十整除,它抓住每一个个位数的错误,几乎是相邻两位数字的每一次交换,但它是一个校验和,不是一个安全功能,它不能证明一张卡是真实的。

有效号码是否意味着该卡有效?

号有效号码仅表示数字在结构上是正确的,因此校验和通过,长度与网络相匹配,账户是否存在、有余额或仍然处于活动状态,只能在真正授权期间由发卡机构确认,结构有效性是预过滤器,而不是可用卡的证明。

卡牌品牌是如何从号码中检测出来的?

牌从第一位数字,发行人识别号读取,Visa以4开头,万事达卡以51-55或2221-2720开头,美国运通以34或37开头,依此类推,每个网络也只允许一定的总长度,因此验证者将前缀和长度一起检查,并报告其匹配的网络。

在此工具中输入卡号安全吗?

是的。该号码完全在您的浏览器中进行处理,并且永远不会上传、记录或传输。您可以通过断开互联网来确认这一点,因为验证器一直在工作时没有连接。也就是说,您仍然应该避免在不需要的任何地方粘贴真实的卡号,并且更喜欢发布的测试号码进行开发。

为什么我的真卡通过卢恩但未能通过长度检查?

That 通常意味着在打字时丢弃或添加了一个数字,Luhn 校验和可以巧合地通过错误长度的数字,因此该工具可以针对检测到的网络独立地检查长度,重新输入完整的数字,并且两个校验应该一起通过。

什么是测试卡号码以及它们为何存在?

测试卡号,例如 4111 1111 1111 1111 由支付提供商发布,以便开发人员可以执行结账表单。它们具有 Luhn 有效性并通过网络检查,因此表单的行为与生产中的行为完全相同,但它们映射到没有真实帐户,并且永远无法收费。它们是正确的东西,可以在任何地方使用,否则您可能会想输入真实的卡。

CVV和卡号有什么区别?

卡号是识别该帐户的长主帐号。 CVV、CVC 或 CID 是短安全码,大多数网络为三位数字,美国运通为四位数字,与该号码分开打印。该工具仅验证卡号;它不检查安全码,安全码由发行人在交易期间验证。

该验证器可以生成有效的信用卡吗?

No。它只检查你输入的数字,它没有办法产生一个绑定到实时帐户的数字。它提供的样本数字是标准发布的测试值,达到没有真实帐户。为真实卡生成数字不是结构验证器可以做的事情,也不是这个工具尝试的事情。


Comments

0 comments

0/2000 characters

No comments yet. Be the first to share your thoughts!