Как лучше всего сгенерировать случайное число для действующей кредитной карты?

Я разрабатываю набор инструментов на Java для проверки и работы с кредитными картами. Пока что я поддерживаю:

  • Проверка LUHN.

  • Дата подтверждения (простое истечение срока).

  • Проверка длины кода карты (CVV, CVC, CID) на основе бренда (Visa, MasterCard и т. Д.).

  • Проверка длины номера кредитной карты (в зависимости от бренда).

  • Проверка BIN / IIN (по базе действительных номеров).

  • Скрытие цифр (425010 * * * * * * 1234)

Чтобы сделать набор инструментов более полным, я хотел бы создать генератор случайных чисел для кредитных карт на основе различных брендов карт. Эта функция (надеюсь) сделает мои тестовые примеры немного более надежными.

В принципе, я хотел бы иметь возможность генерировать числа, которые:

  • LUHN действующий

  • Действует на основе префиксов бренда

  • Действует на основе номеров префиксов BIN / IIN

Для действительных номеров карт BIN / IIN я подумываю найти случайный номер BIN / IIN из базы данных (конечно, на основе бренда), а затем добавить оставшиеся цифры с помощью Random. Очевидно, что большую часть времени это будет недействительно, и мне придется увеличивать одну из цифр, пока она не пройдет проверку LUHN.

Кажется, я не могу придумать лучшего способа. Может быть, кто-нибудь может предложить что-нибудь более умное ...?

Жду ваших предложений! Заранее спасибо! :)


person carlspring    schedule 20.07.2012    source источник
comment
Я упускаю что-то очевидное? Я бы сделал это следующим образом: 1) Получите номер BIN / IIN от dtb. 2) Добавьте случайное число без контрольной цифры (которая является последней цифрой, поэтому вы уменьшите ее на одну цифру). 2) Вычислить последнюю контрольную цифру. Вуаля?   -  person Petr Janeček    schedule 20.07.2012
comment
@Slanec Это частичное решение, но не забывайте, что число не случайное, например карта VISA будет иметь только узкий диапазон начальных цифр.   -  person Widor    schedule 20.07.2012
comment
Это помогает?   -  person oers    schedule 20.07.2012
comment
@Slanec, я думаю, это будет один из способов.   -  person carlspring    schedule 20.07.2012
comment
@oers, боюсь, я не считаю этот ответ или ссылки в нем слишком полезными. Может, я упустил вашу точку зрения ...?   -  person carlspring    schedule 20.07.2012
comment
извините, я забыл некоторые из ваших требований, просматривая некоторые ссылки :) Я просто подумал, что вам нужен набор фиктивных чисел, и забыл часть создания их самого   -  person oers    schedule 20.07.2012
comment
@Slanec, возможно, вы хотели бы опубликовать ответ с примером?   -  person carlspring    schedule 23.07.2012


Ответы (3)


Эта функция (надеюсь) сделает мои тестовые примеры немного более надежными.

Я не уверен. По моему опыту, использовать случайные данные в модульных тестах - не лучшая идея, потому что вы никогда не узнаете, охватили ли вы все важные случаи ... и ошибки.

Я бы рекомендовал создать номера ваших тестовых кредитных карт вручную и позаботиться о том, чтобы они охватывали все случаи, которые необходимо проверить.

person Stephen C    schedule 20.07.2012
comment
Что ж, это то, чем я занимаюсь сейчас. Однако, если у вас есть валидаторы номеров карт, эта случайность не должна вызывать беспокойства, а скорее - доказательство того, что они действительно работают. - person carlspring; 20.07.2012
comment
(Хммм ... 8 месяцев спустя вы проголосовали за и приняли мой ответ. Означает ли это, что я был прав насчет случайных данных, не обеспечивающих вам хорошего тестового покрытия? :-)) - person Stephen C; 06.03.2013
comment
Ха-ха! Нет, я тогда согласился. Вы правы в том, что тестовые данные должны быть легко предсказуемыми и гарантировать воспроизводимые результаты. Я полностью согласен с этим. На самом деле я проверял вопросы, на которые не принимал ответов. Ваше здоровье! ;) - person carlspring; 06.03.2013

Не так давно я создал библиотеку под названием MockNeat. Одна из функций - позволить разработчику генерировать разные действительные номера кредитных карт.

Проверьте этот метод: creditCards ().

Краткий пример записи 1000 кредитных карт AMEX и Mastercard в файл для дальнейшего использования:

 MockNeat m = MockNeat.threadLocal();
    final Path path = Paths.get("cc.txt");

// Write in a file 1000 credit cards AMEX and Mastercard:
 m.creditCards()
            .types(MASTERCARD, AMERICAN_EXPRESS)
            .list(1000)
            .consume(list -> {
                try { Files.write(path, list, CREATE, WRITE); }
                catch (IOException e) { e.printStackTrace(); }
            });
person Andrei Ciobanu    schedule 29.03.2017

Вот несколько Groovy для создания действительных кредитных карт LUHN. Я уверен, что вы можете переписать его на своем родном языке:

cardPrepend = "400141"
cardLength = "16"

random = new Random()
myString = ""

    (cardLength.toInteger() - cardPrepend.length()).times{
        randomNumber = random.nextInt(9)
        myString = myString + randomNumber.toString()  
    }

    myString = cardPrepend + myString

    myStringMinusLastDigit = myString.substring(0, myString.length()-1)
    mod10Digit = getMod10Digit(myStringMinusLastDigit)
    myString = myStringMinusLastDigit + mod10Digit

    return  """${myString}"""  


//-------------------------------------------------------------------------
def getMod10Digit(String number) {
    int weight = 2;
    int sum    = 0;
    for (int i = number.length() - 1; i >= 0; i--) {
        int digit = weight * Integer.parseInt(number.substring(i,i+1));
        sum = sum + (digit / 10) + (digit % 10);
        weight = (weight == 2) ? 1: 2;
    }
 
    
    return ((10 - (sum % 10)) % 10);
    }
person Roberto Rodriguez    schedule 24.05.2021