А на самом деле
CEO предложил нормальную защиту, только зачем-то еще включил туда явную проверку

Достаточно положить файл в каталог с именем типа "ewj383j3" и запросить пароль, после его введения брать отдавать файл который лежит по адресу "введенный_пароль/file.zip". Никакой проверки на пароль не надо, просто юзеру не знающему правильного пароля будет всегда 404.
Правда минус все-же есть. Человек который знает такой пароль может впоследствие давать прямую ссылку на файл (но ведь он может и пароль дать всегда

)
Есть еще способ, можно тоже взять пример от
CEO, но вместо примитивной строки if (pass.toLowerCase() == "qwerty") написать что-то типа if (MD5(pass) == "4J4NR9DJD893LS929SD"), последнее является не самим паролем а его хэшем. На основе хэша разгадать пароль практически невозможно. Взять файл с функцией можно
тут например.
Однако, опять же пароль всегда можно распространить.