Простейшая реализация алгоритма Proof-of-work (доказательство выполнения работы).

Александр Гольдин 8b98e7cc27 Обновить 'pow16.js' 3 years ago
README.md 6261b80fdc Обновить 'README.md' 3 years ago
demo.html 93107f43f6 Загрузить файлы '' 3 years ago
pow16.js 8b98e7cc27 Обновить 'pow16.js' 3 years ago

README.md

ДОКАЗАТЕЛЬСТВО ВЫПОЛНЕНИЯ РАБОТЫ (POW)

Назначение

Скрипт pow16.js определяет функцию pow16(str), реализующую простейший алгоритм Proof-of-work (доказательство выполнения работы). Может использоваться как замена капчи (для предотвращения брутфорса) и в других аналогичных целях.

Описание алгоритма

В каждой итерации вычисляется хэш sha1 от аргумента str с солью sha1(n), где n = 0, 1, 2,... до тех пор, пока 15–18-я цифры результата (всего 16 бит, отсюда и название скрипта) не станут равны abcd. Возвращается число n (количество итераций). Если за миллион итераций результат не достигнут, возвращается undefined:

const pow16 = str => {
   let res = '', n = 0;
   while(res != "abcd") {
      res = sha1(sha1(n.toString()) + str).substr(15, 4);
      n++;
      if (n > 1e6) return;
   }
   return n - 1;
}

Использование

На клиентской стороне функция pow16 может быть использована, например, для вычисления контрольного числа n из строки логин+пароль (str). На серверной стороне проверяется валидность контрольного числа:

if (substr(sha1(sha1($n).$str), 15, 4) != "abcd") {
   // отказываем в авторизации
}

Тестирование

Среднее время выполнения этого алгоритма составляет 1 с (разброс от 50 мс до 4 с в зависимости от входной строки) в браузере Firefox 78.12.0esr из-под ОС Debian 10 (4.19.194-3 x86_64) на компьютере с процессором Intel(R) Core(TM) m3-7Y30 CPU @ 1.00GHz и оперативной памятью 4 ГБ. Такое время задержки позволяет значительно снизить эффективность брутфорса логина и пароля.