Длина ID чтобы не угадали
От: vsb Казахстан  
Дата: 20.02.19 06:23
Оценка:
Есть страница вида /order/123456. 123456 это идентификатор чего-либо. Страница не требует авторизации, в то же время нежелательно, чтобы кто-то мог угадывать валидные идентификаторы, поэтому идентификатор генерируется случайно от 1 до N. Пусть в базе M записей (например миллион). Пусть злоумышленник делает t попыток отгадать (например 1000 в секунду или 86400 * 1000 * 365 * 10 = 315,3 млрд за 10 лет). Пусть хочется, чтобы шанс отгадать хоть один идентификатор был <= 1%. Как правильно посчитать N для таких входных данных?

Я посчитал, у меня непонятная формула получилась. Шанс не угадать в 1 раз (1 — M/N) = (N-M)/N, во второй раз (N-M)/N * (1 — M/(N-1)) = ((N-M)(N-M-1))/(N(N-1)), в t-й раз [(N-M)*(N-M-1)*(N-M-(t-1)]/[N*(N-1)*...*(N-(t-1))] = [(N-M)! * (N-t)!] / [(N-M-t)! * N!]. И чего мне теперь с этими факториалами делать я не понимаю.

В принципе вопрос можно переформулировать как длина идентификатора сессии, там по сути такие же условия, есть M активных сессий, длина идентификатора N, есть атака с подбором сессии.
Re: Длина ID чтобы не угадали
От: Sharov Россия  
Дата: 20.02.19 08:36
Оценка: 1 (1)
Здравствуйте, vsb, Вы писали:

vsb>Есть страница вида /order/123456. 123456 это идентификатор чего-либо. Страница не требует авторизации, в то же время нежелательно, чтобы кто-то мог угадывать валидные идентификаторы, поэтому идентификатор генерируется случайно от 1 до N.


А почему не сделать guid?
Кодом людям нужно помогать!
Re: Длина ID чтобы не угадали
От: scf  
Дата: 20.02.19 08:46
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>В принципе вопрос можно переформулировать как длина идентификатора сессии, там по сути такие же условия, есть M активных сессий, длина идентификатора N, есть атака с подбором сессии.


Вчера в другой теме писал по теме: https://rsdn.org/forum/alg/7378936.1
Автор: scf
Дата: 19.02.19
Re: Длина ID чтобы не угадали
От: MadHuman Россия  
Дата: 20.02.19 13:04
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Есть страница вида /order/123456. 123456 это идентификатор чего-либо. Страница не требует авторизации, в то же время нежелательно, чтобы кто-то мог угадывать валидные идентификаторы, поэтому идентификатор генерируется случайно от 1 до N. Пусть в базе M записей (например миллион). Пусть злоумышленник делает t попыток отгадать (например 1000 в секунду или 86400 * 1000 * 365 * 10 = 315,3 млрд за 10 лет). Пусть хочется, чтобы шанс отгадать хоть один идентификатор был <= 1%. Как правильно посчитать N для таких входных данных?


За одну попытку, вероятность угадать будет — M/N. Соотвественно за t — t*M/N. Ну и осталось посчитать число N для удовлетворившей бы вас вероятности p — N = t*M/p. формула не очень точна, тк не учитывает уменьшения кол-ва вариантов при последующих попытках, но при N существенно превышающих t, думаю этим можно пренебречь.
Re[2]: Длина ID чтобы не угадали
От: vsb Казахстан  
Дата: 20.02.19 15:14
Оценка:
Здравствуйте, Sharov, Вы писали:

vsb>>Есть страница вида /order/123456. 123456 это идентификатор чего-либо. Страница не требует авторизации, в то же время нежелательно, чтобы кто-то мог угадывать валидные идентификаторы, поэтому идентификатор генерируется случайно от 1 до N.


S>А почему не сделать guid?


GUID это 128 битов. Может быть можно обойтись меньшим числом. В частности интересует 72 бита (12 символов в base64).
Re[3]: Длина ID чтобы не угадали
От: Sharov Россия  
Дата: 20.02.19 15:20
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Здравствуйте, Sharov, Вы писали:


vsb>>>Есть страница вида /order/123456. 123456 это идентификатор чего-либо. Страница не требует авторизации, в то же время нежелательно, чтобы кто-то мог угадывать валидные идентификаторы, поэтому идентификатор генерируется случайно от 1 до N.


S>>А почему не сделать guid?


vsb>GUID это 128 битов. Может быть можно обойтись меньшим числом. В частности интересует 72 бита (12 символов в base64).


Зато крайне затруднительно отгадать. В у нутрях можно mapping на человеческий id сделать.
Кодом людям нужно помогать!
Re[3]: Длина ID чтобы не угадали
От: wildwind Россия  
Дата: 21.02.19 07:58
Оценка: +2
Здравствуйте, vsb, Вы писали:

vsb>GUID это 128 битов. Может быть можно обойтись меньшим числом. В частности интересует 72 бита (12 символов в base64).


Ты байты на дисках экономишь? Или этот ID будут по телефону диктовать?
Re[4]: Длина ID чтобы не угадали
От: vsb Казахстан  
Дата: 21.02.19 08:07
Оценка:
Здравствуйте, wildwind, Вы писали:

vsb>>GUID это 128 битов. Может быть можно обойтись меньшим числом. В частности интересует 72 бита (12 символов в base64).


W>Ты байты на дисках экономишь? Или этот ID будут по телефону диктовать?


Я всё экономлю, что можно экономить без дополнительных усилий.
Re[5]: Длина ID чтобы не угадали
От: Doom100500 Израиль  
Дата: 21.02.19 08:30
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Здравствуйте, wildwind, Вы писали:


vsb>>>GUID это 128 битов. Может быть можно обойтись меньшим числом. В частности интересует 72 бита (12 символов в base64).


W>>Ты байты на дисках экономишь? Или этот ID будут по телефону диктовать?


vsb>Я всё экономлю, что можно экономить без дополнительных усилий.


UUID v4: c4de0aa6-5a6b-45a6-9d2d-0008bc0e121c


Разве это много?
Спасибо за внимание
Re[5]: Длина ID чтобы не угадали
От: wildwind Россия  
Дата: 21.02.19 09:20
Оценка: +1 :)
Здравствуйте, vsb, Вы писали:

vsb>Я всё экономлю, что можно экономить без дополнительных усилий.


Кроме своего времени и сил, похоже.
Re: Длина ID чтобы не угадали
От: scf  
Дата: 21.02.19 10:08
Оценка: 39 (2)
Здравствуйте, vsb, Вы писали:

vsb>В принципе вопрос можно переформулировать как длина идентификатора сессии, там по сути такие же условия, есть M активных сессий, длина идентификатора N, есть атака с подбором сессии.


Если нужно, чтобы не угадали, это задача решается вот так:
/order/12345&hmac=1e4f23

Или вот так:
/order/1e4f2312345

Или вот так:
order_id = 12345
hmac_value = hmac(order_id) //1e4f23
display_order_id = rc4(hex(hmac_value) ++ hex(order_id)) // что-то вроде 1aee1516ba

Незачем базу насиловать.
Re[2]: Длина ID чтобы не угадали
От: scf  
Дата: 13.03.19 10:46
Оценка: 2 (1)
Здравствуйте, scf, Вы писали:

scf>Здравствуйте, vsb, Вы писали:


vsb>>В принципе вопрос можно переформулировать как длина идентификатора сессии, там по сути такие же условия, есть M активных сессий, длина идентификатора N, есть атака с подбором сессии.


scf>Если нужно, чтобы не угадали, это задача решается вот так:

scf>/order/12345&hmac=1e4f23

scf>Или вот так:

scf>/order/1e4f2312345

scf>Или вот так:

scf>order_id = 12345
scf>hmac_value = hmac(order_id) //1e4f23
scf>display_order_id = rc4(hex(hmac_value) ++ hex(order_id)) // что-то вроде 1aee1516ba

scf>Незачем базу насиловать.


Захотелось размяться, написал шифрование десятичных чисел на сетях Фейстеля. Оно преобразует n-значное число в другое n-значное число.
https://gist.github.com/scf37/f6506e0bf8eafdf5e1495587340692d5

Помимо, имхо, не очень нужного "чтобы не угадали", шифрование скрывает намного более интересную информацию — общее количество заказов.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.