我正在通过我的 ISP 的在线门户更新我的 Internet 订阅。令我震惊的是,当我输入信用卡详细信息时,我输入了我的信用卡类型(万事达卡、维萨卡、AA 等),当我输入数字时,有一个数字输入错误。当我按下提交按钮时,网站自动给我一个错误,我输入的卡号无效。我感觉这是在浏览器本地完成的,并且没有在服务器上推送和检查数据,也没有发回回复。
每个供应商都有任何数字序列吗?否则,网站(本地)如何知道错误的号码?
我正在通过我的 ISP 的在线门户更新我的 Internet 订阅。令我震惊的是,当我输入信用卡详细信息时,我输入了我的信用卡类型(万事达卡、维萨卡、AA 等),当我输入数字时,有一个数字输入错误。当我按下提交按钮时,网站自动给我一个错误,我输入的卡号无效。我感觉这是在浏览器本地完成的,并且没有在服务器上推送和检查数据,也没有发回回复。
每个供应商都有任何数字序列吗?否则,网站(本地)如何知道错误的号码?
CC 号码以及几乎任何其他精心设计的重要号码(例如银行帐号)都倾向于包含校验和以验证号码的完整性。虽然不是一项安全功能(因为计算起来很简单),但如果 (a) 出现单个拼写错误或 (b) 交换两个相邻数字(这是手动操作时最常见的两个错误),体面的校验和算法可以保证始终失败输入长数字。
http://rosettacode.org/wiki/Luhn_test_of_credit_card_numbers就是这种测试的一个例子。
如果 CC 号码在技术上是正确的,它可能仍然不是真正的 CC 号码。验证方法既简单又复杂 - 通常,如果您有适当的访问权限,您可以为每个卡号范围查找发卡机构,然后询问发卡机构 [s card systems] 是否他们认为这是一张有效的卡。好吧,第二部分通常作为 CC 支付的一部分发生,但有时会在此之前验证发行人,作为扩展测试;但不在客户端浏览器上。
在美国,他们使用 Luhn 算法:
http://en.wikipedia.org/wiki/Luhn_algorithm
校验位是通过计算数字总和然后计算该值的 9 倍模 10 获得的。在算法形式中:
数字:(校验位4321-5678-7531-456x
在哪里x
)。
1. Number: 4 3 2 1 5 6 7 8 7 5 3 1 4 5 6 X
2. Double every second: 8 4 10 14 14 6 8 12
3. Sum digits >9: 8 3 4 1 1 6 5 8 5 5 6 1 8 5 3
4. Sum all digits: 8 + 3 + 4 + 1 + 1 + 6 + 5 + 8 + 5 + 5 + 6 + 1 + 8 + 5 + 3 = 69
5. Multiply sum by 9: 69 x 9 = 621
6. Take value mod 10: 621 mod 10 = 1 => x = 1
校验位是1
,完整的有效数字是4321-5678-7531-4561
。
如果您要再次运行算法来验证数字,那么步骤 4 中所有数字的总和将是69 + 1 = 70
。那么, 70 mod 10 = 0
, 所以这个数根据算法是有效的。
大多数(但不是全部)卡方案使用其他答案中描述的校验和(Luhn)测试。但是,除此之外,一些算法还使用(相当基本的)基于卡号开头的卡范围识别(CRR)(AKA 范围)。有些还检查卡的长度。
例如,参见以下描述的许多不同算法的相似性:- https://stackoverflow.com/questions/72768/how-do-you-detect-credit-card-type-based-on-number