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%の方法ではありません。ただし、キー付きカード番号の入力を許可するMastercardおよびVisa製品のカード番号は、このチェックに合格する必要があります。

カード番号が存在するかどうかを検証する唯一の100%の方法は、トランザクションを実行することです。通常、PoS接続に使用されるAcquirer Host Systemプロトコルには、カードがストップリストになく、ルーティングテーブルに存在するかどうかを検証するためのプロビジョニングがあります。

于 2012-09-25T16:11:48.790 に答える