Как сгенерировать проверочный код / ​​номер?

Другое событие NullPointerException возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.

String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals для гарантированного непустого объекта.

Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null.

Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.

String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

25
задан OmG 15 May 2019 в 01:39
поделиться

9 ответов

После некоторого исследования я думаю, что пойду с Модификация ISO 7064 97,10 формула. Это кажется довольно твердым, поскольку это используется для проверки IBAN (Международный Номер банковского счета).

формула очень проста:

  1. Берут число: 123456
  2. Применяют следующую формулу для получения этих 2 контрольных сумм цифр: mod(98 - mod(number * 100, 97), 97) => 76
  3. номер Concat и контрольная сумма для получения кода => 12345676
  4. Для проверки кода проверьте что mod(code, 97) == 1

Тест:

  • mod(12345676, 97) = 1 => ХОРОШИЙ
  • mod(21345676, 97) = 50 => ПЛОХО!
  • mod(12345678, 97) = 10 => ПЛОХО!

, По-видимому, этот алгоритм фиксирует большинство ошибок.

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

29
ответ дан Glen Selle 15 May 2019 в 01:39
поделиться

Для 1M комбинации Вам будут нужны 6 цифр. Чтобы удостовериться, что нет никаких случайно допустимых кодов, я предлагаю 9 цифр с 1/1000 шансом, что работает случайный код. Я также предложил бы использовать другую цифру (10 общих количеств) для выполнения проверка целостности . До шаблонов распределения, случайных, будет достаточен, и контрольный разряд гарантирует, что единственная ошибка не приведет к корректному коду.

Редактирование: , По-видимому, я не полностью считал Ваш запрос. Используя номер кредитной карты, Вы могли выполнить хеш на нем (MD5 или SHA1 или что-то подобное). Вы тогда усекаете в соответствующем месте (например, 9 символов) и преобразовываете в основу 10. Тогда Вы добавляете контрольный разряд (разряды), и это должно более или менее работать на Ваши цели.

4
ответ дан Kyle Cronin 15 May 2019 в 01:39
поделиться
  • 1
    не работа, все еще показывающая, не делают (...) меню только – Vineesh TP 10 August 2017 в 07:19

Вы хотите сегментировать свой код. Часть его должна быть 16-разрядным CRC остальной части кода.

, Если все Вы хотите, число проверки, тогда просто используют порядковый номер (предполагающий, что у Вас есть единственная точка поколения). Тем путем Вы знаете, что не получаете дубликаты.

Тогда Вы снабжаете префиксом последовательность CRC-16 того порядкового номера И некоторого закрытого ключа. Можно использовать что-либо для закрытого ключа, пока Вы сохраняете его частным. Сделайте его чем-то большим, по крайней мере, GUID, но это мог быть текст к Война и мир от Gutenberg проекта. Просто потребности быть секретным и постоянным. Наличие закрытого ключа предотвращает людей от способности подделать ключ, но использование CR на 16 битов облегчает повреждаться.

Для проверки Вы просто разделяете число на его две части, и затем берете CRC-16 порядкового номера и закрытого ключа.

, Если Вы хотите затенить последовательную часть больше, затем разделите CRC в двух частях. Поместите 3 цифры в переднюю сторону и 2 позади последовательности (нулевая клавиатура, таким образом, продолжительность CRC последовательна).

Этот метод позволяет Вам запускаться с меньших ключей также. Первые 10 ключей будут 6 цифрами.

2
ответ дан Jim McKeeth 15 May 2019 в 01:39
поделиться
  • 1
    Insted android:actionProviderClass =" использования; android.widget. ShareActionProvider"/> Используйте app:actionProviderClass =" андроид support.v7.widget. ShareActionProvider"/> – Quimbo 9 February 2019 в 05:07

Это должны быть только числа? Вы могли создать случайное число между 1 и 1M (я предложу еще выше, хотя) и затем Base32 кодируют его . Следующей вещью, которую необходимо сделать, является Хеш, которые оценивают (использование секретного соленого значения), и base32 кодируют хеш. Тогда добавьте две строки вместе, возможно, разделенный тире.

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

1
ответ дан Haacked 15 May 2019 в 01:39
поделиться

При создании кода подтверждения у Вас есть доступ к номеру телефона вызывающей стороны?

Раз так я использовал бы номер телефона вызывающей стороны и выполнил бы его через своего рода хеш-функцию так, чтобы можно было гарантировать, что код подтверждения, который Вы дали вызывающей стороне на шаге 1, является тем же, что они входят в шаг 2 (чтобы удостовериться, что они не используют код доступа друга, или они просто высказали очень удачное предположение).

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

, Конечно, это не будет работать, если номер телефона, используемый на шаге 1, будет отличаться, чем тот, они звонят от в шаг 2.

0
ответ дан matt b 15 May 2019 в 01:39
поделиться
  • 1
    Может проверить, что это решило проблему для меня на Монетном дворе 18 Xfce x64..., о, и благодарит:-), – Adam Houldsworth 2 November 2016 в 19:58

Принятие Вас уже знает, как обнаружить, которые включают пользовательский хит, это должно быть выполнимо обоснованно легко. В мире безопасности существует понятие "одного времени" пароль. Это иногда упоминается как "доступный пароль". Обычно они ограничиваются (легко typable) значениями ASCII. Так, [a-zA-z0-9] и набор легко typable символов. как запятая, точка, полу двоеточие и круглая скобка. В Вашем случае, тем не менее, Вы, вероятно, хотели бы ограничить диапазон [0-9] и возможно включать * и #.

я неспособен объяснить все технические детали того, как эти одноразовые коды сгенерированы (или работа) соответственно. Существует некоторая промежуточная математика позади него, которую я забил бы без первого рассмотрения его сам. Достаточно сказать, что Вы используете алгоритм для генерации потока одноразовых паролей. Неважно, как mnay предыдущие коды, которые Вы знаете, последующий, должно быть невозможно предположить! В Вашем случае Вы будете просто использовать каждый пароль в списке как случайный код пользователя.

, А не сбой при объяснении деталей реализации самостоятельно, я направлю Вас к статье на 9 страниц, где можно читать на нем сами: https://www.grc.com/ppp.htm

0
ответ дан Rob Rolnick 15 May 2019 в 01:39
поделиться
  • у меня должно быть разумное количество возможных комбинаций (скажем, 1M)
  • , код должен быть максимально коротким, для предотвращения ошибок от пользователя

ну, если Вы хотите, чтобы он имел по крайней мере один миллион комбинаций, тогда Вам нужны по крайней мере шесть цифр. Это достаточно коротко?

0
ответ дан Chris Upchurch 15 May 2019 в 01:39
поделиться
  • 1
    Я могу подтвердить, что решение добавления repo к /etc/apt/sources-list также зафиксировало его для Ubuntu 16.04 – Stoyan Dimov 25 May 2016 в 12:39

Вы связались с эти контрольные разряды проект, и использование "закодировать" функции походит на хорошее решение. Это говорит:

кодируют, может выдать исключение, если 'плохие' данные (например, нечисловой) передаются ему, в то время как проверяют только TRUE или FALSE возвратов. Идея здесь, это кодирует, обычно добирается, это - данные из 'доверяемых' внутренних источников (ключ базы данных, например), таким образом, это должно быть довольно обычно, на самом деле, исключительный, в котором передаются неправильные данные.

, Таким образом, это походит, Вы могли передать закодировать функцию ключ базы данных (5 цифр, например), и Вы могли получить число, которое будет отвечать Вашим требованиям.

0
ответ дан Michael Sharek 15 May 2019 в 01:39
поделиться
  • 1
    Аккуратный.Спасибо. I' ll сразу пробуют это! – Andrie 24 March 2014 в 06:58

Это кажется, что у Вас есть невысказанное требование, чтобы это было быстро определено, с помощью алгоритма, что код допустим. Это исключило бы Вас, просто раздав список чисел одноразового шифра.

существует несколько способов, которыми люди сделали это в прошлом.

  1. Делают и закрытый ключ с открытым ключом. Закодируйте номера 0-999 999 с помощью закрытого ключа и раздайте результаты. Необходимо будет добавить некоторые случайные числа, чтобы заставить результат выйти к более длительной версии, и необходимо будет преобразовать результат основы 64 для базирования 10. Когда Вы ввели число, преобразовываете его назад в base64, применяете закрытый ключ и видите, находятся ли интересные числа под 1,000,000 (отбросьте случайные числа).
  2. Использование обратимое Использование хеш-функции
  3. первый миллион чисел от PRN отобран в определенном значении. Функция "проверки" может получить семя и знать, что следующий миллион значений хорош. Это может или генерировать их каждый раз и проверить один за другим, когда код получен, или на программе, запуск хранит их всех в таблице, отсортированной, и затем использует двоичный поиск (максимум выдерживает сравнение), так как один миллион целых чисел не является большим количеством пространства.

существует набор других опций, но они распространены и легки реализовать.

-Adam

0
ответ дан Adam Davis 15 May 2019 в 01:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: