4

.NET 4.5 包含一个名为 as 的新验证属性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 没有提供太多关于此的信息。事实上,他们的错误信息如下:

评论

该值使用正则表达式进行验证。该类不验证信用卡号是否对购买有效,仅验证其格式正确。

4

2 回答 2

6

最后一行:

return num % 10 == 0;

非常强烈地暗示这是一个Luhn 算法

于 2012-09-25T11:48:46.390 回答
3

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

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

于 2012-09-25T16:11:48.790 回答