Используйте регулярное выражение, чтобы удалить все слова, которые не совпадают:
import re
pattern = re.compile(r'\b(' + r'|'.join(stopwords.words('english')) + r')\b\s*')
text = pattern.sub('', text)
Это, вероятно, будет намного быстрее , чем зацикливание, особенно для больших строк ввода.
Если последнее слово в тексте будет удалено из-за этого, у вас может быть завершающий пробел. Я предлагаю разобраться с этим отдельно.
Вам действительно стоит взглянуть на PHPASS: http://www.openwall.com/phpass/ Это фреймворк для хеширования паролей с использованием crypt (), который используется в таких проектах, как Wordpress и phpBB.
На этом сайте также есть отличная статья о хешировании, посоле и растяжении пароля с использованием crypt (): http://www.openwall.com/articles/PHP-Users-Passwords
ОБНОВЛЕНИЕ: В настоящее время есть альтернатива для библиотеки PHPASS. В следующей версии PHP есть специальные функции для хеширования и проверки паролей (с использованием bcrypt): http://www.php.net/manual/en/ref.password.php . Существует библиотека совместимости, которая реализует эти функции для PHP 5.3.7+: https://github.com/ircmaxell/password_compat
Вы хорошо используете crypt()
. crypt($input, $stored) == $stored
- это способ его использования.
Ваша функция get_salt()
невелика, поскольку она использует часто плохую функцию rand()
. Вам следует рассмотреть возможность использования более сильной случайной функции, например, openssl_random_pseudo_bytes()
.
Идея «радужной таблицы» заключается в том, что злоумышленник может создать таблицу со всеми возможными паролями и их хэшами дома.
Е.Г.
PASSWORD HASH
iloveSO gjroewjgo
password knbnogjwm
secret gjroehghe
jbieber rewgroewj
и т. Д.
С помощью этой таблицы злоумышленник может быстро преобразовать любой хэш в пароль. Радужный стол использует некоторые приемы, так что не все хэши нужно хранить, но он все равно вычисляет все хеши заранее.
Используя соль, даже сохраняя ее с паролем, вы делаете это намного сложнее. Вместо того, чтобы хэшировать каждое слово в словаре, злоумышленнику теперь придется хэшировать каждое слово каждой солью . С достаточно длинной солью это дает достаточно комбинаций, чтобы сделать невозможным вычисление всех этих хешей.
Таким образом, соль не является дополнительным паролем, известным только приложению, она предназначена для изменения хеш-функции, чтобы она была нестандартной.
Это неправильное использование crypt (), потому что вы используете устаревший примитив. Blowfish очень старый, twofish является заменой, и даже он старый, потому что Threefish почти завершена. Вы должны использовать члена семейства sha2, оба sha256 или sha512 - хороший выбор. crypt () может использоваться с sha256 или sha512, вы должны использовать параметры CRYPT_SHA256 CRYPT_SHA512 соответственно.
Кроме того, ваши соли имеют очень малое соотношение энтропии / размера, вы используете только буквенно-цифровой набор, который является шуткой, потому что буквенно-цифровые радужные таблицы являются наиболее распространенными. Вы должны использовать полный байт, который base256, и я рекомендую соль длиной 256 байт. Имейте в виду, что все хеш-функции по определению являются бинарно-безопасными, поэтому вам не нужно беспокоиться о нулевых байтах и тому подобном.
Используйте SHA-512 (если доступно) с солью, которая включает time () и openssl_random_pseudo_bytes (). Crypt консолидирован / эффективен, потому что возвращает соль, вставленную с хешированной строкой.