CreditCardAttribute 使用哪种算法进行信用卡号格式验证

Posted

技术标签:

【中文标题】CreditCardAttribute 使用哪种算法进行信用卡号格式验证【英文标题】:Which algorithm does CreditCardAttribute use for credit card number format validation 【发布时间】:2012-09-16 19:45:03 【问题描述】:

.NET 4.5 包含一个名为CreditCardAttribute 的新验证属性,该属性指定数据字段值是信用卡号。当我反编译包含这个类的程序集时,我可以看到以下用于信用卡号码验证的代码:

public override bool IsValid(object value)

  if (value == null)
  
    return true;
  
  string text = value as string;
  if (text == null)
  
    return false;
  
  text = text.Replace("-", "");
  text = text.Replace(" ", "");
  int num = 0;
  bool flag = false;
  foreach (char current in text.Reverse<char>())
  
    if (current < '0' || current > '9')
    
      return false;
    
    int i = (int)((current - '0') * (flag ? '\u0002' : '\u0001'));
    flag = !flag;
    while (i > 0)
    
      num += i % 10;
      i /= 10;
    
  
  return num % 10 == 0;

有人知道这里应用了哪种算法来验证数字格式吗?卢恩算法?另外,这是ISO标准吗?最后,您认为这是正确且 100% 正确的实现吗?

MSDN 没有提供太多关于此的信息。事实上,他们的错误信息如下:

备注

使用正则表达式验证值。班级不 验证信用卡号对购买有效,只有 它的格式很好。

【问题讨论】:

看起来像 Luhn's 的一个不太高效的实现 @SWeko 谢谢!我真的没有太多关于正确算法的信息。您是否有或知道任何更好的方法来验证信用卡类型以 100% 正确?还是根本不可能? @tugberk 如果您正在处理付款,我使用的 API 有一个预身份验证步骤,用于验证卡号并确认其有效性(可能还有余额?)。您调用它,然后处理您的订单并批准预授权步骤。您可以使用该步骤来验证卡。 @KirkBroadhurst 谢谢柯克!是的,你是对的。我使用的那个也有这个验证步骤。但是,如果这不是一个动态变化的标准并且可能以 100% 正确的方式实施,那么在早期验证这一点并避免网络调用的成本会很棒。 @KirkBroadhurst 我也遵循这条规则。但是在最后的支付阶段(当用户发送支付输入时),我希望能够(如果可能的话)在去其他服务之前查看信用卡是否格式正确。当他们现在将其纳入 .NET Framework 时,我认为此实现应该是 100% 正确的,但我不能确定,因为我不知道标准算法。 【参考方案1】:

最后一行:

return num % 10 == 0;

非常强烈地暗示这是Luhn Algorithm

【讨论】:

【参考方案2】:

这个算法真的是Luhn的算法。不幸的是,并非所有卡号都可以通过此算法验证,因此它不是 100% 的方法。但是,允许输入卡号的万事达卡和维萨卡产品的卡号应通过此检查。

验证卡号是否存在的唯一 100% 方法是执行交易。通常,用于 PoS 连接的收单方主机系统协议具有验证卡是否不在停止列表中以及是否存在于路由表中的规定。

【讨论】:

以上是关于CreditCardAttribute 使用哪种算法进行信用卡号格式验证的主要内容,如果未能解决你的问题,请参考以下文章

13种Shell逻辑与算术,能写出5种算你赢!

13种Shell逻辑与算术,能写出5种算你赢!

如何把azw3,mobi,epub等文件转换成常见的格式

球坐标转换的疑惑

什么是JVM的垃圾回收

Android:我应该使用哪种图像格式,为啥? [关闭]