powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Генерация случайного числа
21 сообщений из 21, страница 1 из 1
Генерация случайного числа
    #39484482
sqr_khv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. Подскажите пжл по такому вопросу. Есть задача генерировать случайное число от 1000 до 9999, при этом нужно исключать последовательность или одни и те же числа (т.е. 1111, 2222, 1234, 4321 и т.д. - такие числа надо игнорировать). Так возможно сделать? Про dbms_random в курсе, только как исключать такие - не могу придумать...

Зачем это нужно - мне необходимо генерировать ПИН платежной карты. Если делать через HSM, то так не получится (пробовал на Java) - после получения ПИН блока нельзя получить "чистый" ПИН, т.к. из-за соображений безопасности не дает дешифровать.
...
Рейтинг: 0 / 0
Генерация случайного числа
    #39484485
sqr_khv,

просто сравни, их же всего то 10
...
Рейтинг: 0 / 0
Генерация случайного числа
    #39484487
sqr_khv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
не усложняй, а по другому нельзя? :)
...
Рейтинг: 0 / 0
Генерация случайного числа
    #39484489
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не усложняйsqr_khv,

просто сравни, их же всего то 10С последовательностями несколько больше.
...
Рейтинг: 0 / 0
Генерация случайного числа
    #39484493
coborhc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sqr_khv,

Я бы наверно составил таблицу всех возможных ПИНов, а потом из нее удалил недопустимые.
И затем выбирал бы строку таблицы со случайным номером.
Это даст преимущество в том, что если правила будут меняться (например решат, что "зеркальные" тоже нельзя), то их проще будет "удовлетворить"
...
Рейтинг: 0 / 0
Генерация случайного числа
    #39484519
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
create or replace function GetPin return varchar2 as
l_pin number;

function IsCorrect(p_pin number) return boolean as
l_d1   number;
l_d2   number;
l_d3   number;
l_d4   number;
l_sign number;
begin
    l_d1 := trunc(    p_pin / 1000       );
    l_d2 := trunc(mod(p_pin,  1000) / 100);
    l_d3 := trunc(mod(p_pin,  100)  / 10 );
    l_d4 :=      (mod(p_pin,  10 )       );

    l_sign := sign(l_d1 - l_d2);

    if (l_d1 = l_d2 and l_d2 = l_d3 and l_d3 = l_d4) or
       (l_sign = sign(l_d2 - l_d3) and l_sign = sign(l_d3 - l_d4) and abs(l_d1 - l_d2) = 1 and abs(l_d2 - l_d3) = 1 and abs(l_d3 - l_d4) = 1) then
        return false;
    end if;

    return true;
end;

begin
    loop
        l_pin := trunc(dbms_random.value(1000, 9999));
        exit when IsCorrect(l_pin);
    end loop;

    return to_char(l_pin);
end;
/

Функция создана.

Затрач.время: 00:00:00.05

select GetPin
from dual
connect by level <= 30;

GETPIN
-----------------------------------------------------------------------------------------------------------------------------------------------------
8680
9276
6812
6502
9067
5375
8993
7976
7136
4704
4498
9560
3015
3173
4105
3069
3960
8859
4736
9515
9516
1937
6398
7136
2491
2850
3779
2166
4546
9160

30 строк выбрано.

...
Рейтинг: 0 / 0
Генерация случайного числа
    #39484571
sqr_khv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AmKad, спасибо! В понедельник потестирую её. Это намного лучше, чем предлагают выше.
...
Рейтинг: 0 / 0
Генерация случайного числа
    #39484582
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sqr_khvAmKad, спасибо! В понедельник потестирую её. Это намного лучше, чем предлагают выше.
Не намного.
Держать табличку < 10000 коротких строк - вообще никаких проблем, а по управляемости (правилам) - сплошной профит.
Заодно наглядно (путем count(*)) увидите, насколько сократили перебор потенциальному злоумышленнику.
...
Рейтинг: 0 / 0
Генерация случайного числа
    #39484586
coborhc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sqr_khv,

как знать...

позволю себе немного "улучшить" этот фрагмент:

Код: plsql
1.
2.
3.
4.
5.
    l_sign := sign(l_d1 - l_d2);
    if (l_d1 = l_d2 and l_d2 = l_d3 and l_d3 = l_d4) or
       (l_sign = sign(l_d2 - l_d3) and l_sign = sign(l_d3 - l_d4) and abs(l_d1 - l_d2) = 1 and abs(l_d2 - l_d3) = 1 and abs(l_d3 - l_d4) = 1) then
        return false;
    end if;



так проще:
Код: plsql
1.
2.
3.
4.
5.
    l_delta := l_d1 - l_d2;
    if (l_d1 = l_d2 and l_d2 = l_d3 and l_d3 = l_d4) or
       (l_d2 - l_d3 = l_delta and l_d3 - l_d4 = l_delta then
        return false;
    end if;
...
Рейтинг: 0 / 0
Генерация случайного числа
    #39484589
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sqr_khvнужно исключатьЛюбые ограничения на пароли это снижение числа вариантов для брутфорса.
...
Рейтинг: 0 / 0
Генерация случайного числа
    #39484592
coborhc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вернее правильней так:
Код: plsql
1.
2.
3.
4.
5.
l_delta := l_d1 - l_d2;
    if (l_d1 = l_d2 and l_d2 = l_d3 and l_d3 = l_d4) or
       (abs(l_delta) = 1 and l_d2 - l_d3 = l_delta and l_d3 - l_d4 = l_delta) then
        return false;
    end if;
...
Рейтинг: 0 / 0
Генерация случайного числа
    #39484679
coborhc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-2-,

Брутфорс в данном случае не применим. Пин используется только в терминалах и банкоматах, а там допустимо весьма ограниченное количество попыток, а затем карта блокируется.
...
Рейтинг: 0 / 0
Генерация случайного числа
    #39484723
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Помимо авторизации в банкоматах бывает еще возможность смены пина. Некоторые банки также дают сменить пин по телефону через тональный набор.
...
Рейтинг: 0 / 0
Генерация случайного числа
    #39484753
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
coborhc,

При наличии видеоряда с рукой над клавиатурой терминала, знание об ограничениях позволяет отсечь варианты.
...
Рейтинг: 0 / 0
Генерация случайного числа
    #39484768
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sqr_khvДобрый день. Подскажите пжл по такому вопросу. Есть задача генерировать случайное число от 1000 до 9999, при этом нужно исключать последовательность или одни и те же числа (т.е. 1111, 2222, 1234, 4321 и т.д. - такие числа надо игнорировать)а что такое "одни и те же числа" в твоём примере
...
Рейтинг: 0 / 0
Генерация случайного числа
    #39484803
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
coborhcБрутфорс в данном случае не применим.Ну тогда с уверенностью можно обойтись одной цифрой для пин-кода. Тоже ведь не стопроцентная вероятность получить доступ за три попытки.
...
Рейтинг: 0 / 0
Генерация случайного числа
    #39485006
coborhc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env,
2! попытки всего, затем карта блокируется.
какие там варианты отсекать? вот если ПИН "простой", то его проще и без видеоряда и подсмотреть и запомнить.

AmKad
про смену по телефону не знаю, но почти уверен, что после нескольких неудачных попыток, по крайней мере этот сервис должен блокироваться.
...
Рейтинг: 0 / 0
Генерация случайного числа
    #39485668
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
coborhcenv,
2! попытки всего, затем карта блокируется.
какие там варианты отсекать? вот если ПИН "простой", то его проще и без видеоряда и подсмотреть и запомнить.

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

....
stax
...
Рейтинг: 0 / 0
Генерация случайного числа
    #39485983
Glays
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymoussqr_khvAmKad, спасибо! В понедельник потестирую её. Это намного лучше, чем предлагают выше.
Не намного.
Держать табличку < 10000 коротких строк - вообще никаких проблем, а по управляемости (правилам) - сплошной профит.
Заодно наглядно (путем count(*)) увидите, насколько сократили перебор потенциальному злоумышленнику.
Ещё легко можно включить в такой справочник год рождения/выпуска/закрытия/текущий, последние четыре цифры номера телефона и номер планеты в Тентуре.
...
Рейтинг: 0 / 0
Генерация случайного числа
    #39485991
coborhc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-2-,

нет, лучше сделать пин из 100+ знаков, что б уж наверняка не подобрали :)
...
Рейтинг: 0 / 0
Генерация случайного числа
    #39486293
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
coborhc-2-,

нет, лучше сделать пин из 100+ знаков, что б уж наверняка не подобрали :)
ужесточили требование к паролям, в результате 90% записывают и "под клаву"

.....
stax
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Генерация случайного числа
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]