Комментарии 25
Появилась идея… Возможно, немного бредовая. Выдавать зашифрованный пакет на запрос с сервера, клиент пытается его расшифровать.
В пакете содержится уникальный ключ. Потом клиент отправляет серверу свой email с этим ключём.
Случайность заключается именно в расшифровке пакета на стороне клиента.
Итого, пойдут те первые %n% кто пришлет свой email.
Как вариант, написал по "фану" :)
Email-ы возьмите из eparts.txt
Идея прикольная, кстати. Но мы хотели чтобы участвовали все, а не только те кто пришел посмотреть дод.
Ну можно на сервере проверять есть ли email в этом самом списке
А как вы Сид генерировали? Что мешало это сфабриковать?)
Вот так
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
Проверьте, у вас hash для строки из чата будет тот же что и у меня. В логах на видео он есть.
Что мешало подменить код?) Сфабриковать можно все что угодно :)
Откуда берется строка?
Если да, идемте к нам преподавать ИБ.
Что мешает подговорить людей, которые пишут в чат?
Если у вас нет паранои, это не значит что за вами не следят.
Хешируем все емейлы, публикуем упорядоченный список хешей, использованный алгоритм (например, SHA-256) и использованную соль. Каждый может посчитать хеш для своего емейла, и найти его в списке под определенным нормером.
2) Выбираем ГПСЧ.
Не надо изобретать велосипед. Публикуем, что будет использоваться ГПСЧ из такой-то библиотеки такой-то версии. Каждый может запустить и проверить потом.
3) Выбор seed ГПСЧ.
Публикуем алгоритм выбора seed. Он должен быть легко-верифицируемым и трудно-подделываемым. Как вариант, алгоритм должен быть основан на публичных данных, которые еще не известны на момент публикации самого алгоритма.
Например, берем газету New York Times, номер который должен выйти в день розыгрыша, выбираем первые буквы первых 10 слов на 2 странице. Легко проверить даже спустя годы после розыгрыша (найти архив газеты), трудно подделать (если нет знакомого редактора в NY Times)
Эм… У вас в коде для выбора email-ов нет защиты от многократного попадания одного и того же ящика в список победителей.
List<String> draw(List<String> emails) {
System.out.println("Draw for the seed: " + seed);
Random rnd = new Random(seed);
Set<String> winners = new HashSet<>();
while (winners.size() < Math.min(winnersCount, emails.size())) {
int index = rnd.nextInt(emails.size());
System.out.println("Ball: " + index);
winners.add(emails.get(index));
}
return new ArrayList<>(winners);
}
Для достоверности надо опубликовать список хэшей адресов, скажем, SHA-256. Ну выбирать, соответственно, хеши победителей. В качестве долполнительного теста — пусть сами проверяют, не их ли почта выиграла. При таком подходе каждый сможет убедиться, что его почта действительно участвовала в розыгрыше.
Как провести розыгрыш призов среди Java программистов