Простейшая реализация алгоритма Proof-of-work (доказательство выполнения работы).
Александр Гольдин 8b98e7cc27 Обновить 'pow16.js' | 3 years ago | |
---|---|---|
README.md | 3 years ago | |
demo.html | 3 years ago | |
pow16.js | 3 years ago |
Скрипт 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 ГБ. Такое время задержки позволяет значительно снизить эффективность брутфорса логина и пароля.