Skip to main content

V2.1.3 Password Security

Requirement:#

Verify that password truncation is not performed. However, consecutive multiple spaces may be replaced by a single space. (C6)

Explanation:#

Под усечением пароля (Password truncation) понимается отсечение или сокращение пароля после определенного количества символов. Такая практика не приветствуется, поскольку она снижает общую энтропию или непредсказуемость пароля, что облегчает злоумышленникам его угадывание или перебор. Например, если пароль "Password123" усечен после первых 8 символов, то он становится "Password", что значительно слабее.

Однако требование допускает замену нескольких пробелов подряд на один пробел. Это означает, что если пользователь при вводе пароля случайно добавит несколько пробелов между символами, то приложение должно воспринимать их как один пробел. Это делается для того, чтобы повысить удобство работы пользователя и сделать его более снисходительным к незначительным ошибкам при вводе пароля. Важным моментом является то, что такая обработка должна выполняться до дальнейшей обработки или хранения пароля.

Например, рассмотрим пароль "Hello World" с тремя пробелами между "Hello" и "World". Согласно этому требованию, приложение должно рассматривать эти три пробела как один пробел и считать пароль "Hello World" для целей проверки и хранения.

В целом, данное требование направлено на достижение баланса между удобством использования и безопасностью. Не выполняя усечения пароля и разрешая замену нескольких пробелов подряд одним пробелом, приложения могут гарантировать, что пароли не будут ослаблены, и при этом будут учитывать незначительные ошибки ввода пользователя.

Remediation:#

Для соответствия требованию, необходимо выполнить следующие:

1 Password Truncation Fix:

  • Убедитесь, что пароли не усекаются и не сокращаются после определенного количества символов. Полный пароль должен приниматься и проверяться в том виде, в котором он был введен пользователем.

2 Handling Consecutive Multiple Spaces Fix:

  • Реализовать этап предварительной обработки пароля с заменой нескольких пробелов подряд на один пробел перед дальнейшей обработкой или проверкой пароля. Данная активность должна выполняться сразу после получения пароля от пользователя.

Этапы реализации требования:

Step 1: Password Validation Function Создайте функцию проверки пароля, которая будет проверять его надежность и соответствие требованиям безопасности. Эта функция не должна усекать пароль и должна обрабатывать последовательные пробелы.

Step 2: Replace Multiple Spaces Перед проверкой пароля необходимо реализовать шаг замены нескольких пробелов подряд на один пробел. Для этого можно использовать регулярные выражения или функции манипулирования строками.

Step 3: User Feedback Обеспечьте понятную и удобную обратную связь с пользователем, если его пароль не соответствует требованиям безопасности. Сообщите пользователю о недопустимых символах или о необходимости использования более надежных паролей, не раскрывая при этом правил работы с паролями.

Step 4: Store Full Password Hash При хранении паролей в базе данных обязательно храните полный хэш пароля без каких-либо усечений.

Step 5: Secure Password Storage Перед хранением в базе данных необходимо хэшировать и salt пароли с помощью надежного криптографического алгоритма, например bcrypt или Argon2. Никогда не храните пароли в открытом виде.

Step 6: Test for Vulnerabilities Проведите тестирование приложения на предмет выявления уязвимостей, связанных с обработкой паролей, их усечением или заменой нескольких пробелов. 

Step 7: Review Codebase Проведите анализ кода, чтобы убедиться, что функции обработки паролей и логика проверки соответствуют требованиям OWASP и что нигде в приложении не происходит усечения пароля.

Пример функции проверки пароля
import re
import bcrypt
# Password Validation Function
def is_strong_password(password):
# Check if password has at least 8 characters and contains at least one uppercase letter, one lowercase letter,
# one digit, and one special character.
regex_pattern = r"^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$"
return re.match(regex_pattern, password)
# Password Pre-processing Function
def preprocess_password(password):
# Replace consecutive multiple spaces with a single space
processed_password = re.sub(r"\s+", " ", password)
return processed_password
# Hash and Salt Password
def hash_password(password):
salt = bcrypt.gensalt()
hashed_password = bcrypt.hashpw(password.encode(), salt)
return hashed_password
# Example usage in your application
def user_registration():
# Get the password from the user
raw_password = input("Enter your password: ")
# Preprocess the password
processed_password = preprocess_password(raw_password)
# Validate the password
if not is_strong_password(processed_password):
print("Password is not strong enough. Please use a stronger password.")
return
# Hash and salt the password
hashed_password = hash_password(processed_password)
# Store the hashed password in the database (simulated in this example)
print("User registration successful! Password has been securely stored.")
# Example of user registration
user_registration()

В данном примере:

    Функция is_strong_password проверяет, соответствует ли пароль требуемым критериям сложности (не менее 8 символов, одна заглавная буква, одна строчная буква, одна цифра и один специальный символ).

    Функция preprocess_password заменяет несколько пробелов подряд на один пробел с помощью регулярных выражений.

    Функция hash_password хеширует и солит пароль, используя библиотеку bcrypt, которая является сильным криптографическим алгоритмом для хеширования паролей.

    В функции user_registration (пример сценария регистрации пользователя) введенный пользователем пароль предварительно обрабатывается, проверяется и после хеширования надежно сохраняется в базе данных.

Обратите внимание, что это упрощенный пример, и в реальных приложениях необходимо использовать соответствующую базу данных и позаботиться о других аспектах безопасности, таких как аутентификация пользователей, безопасное хранение паролей и защита от других распространенных уязвимостей веб-приложений. 

Additional:#

https://pages.nist.gov/800-63-3/sp800-63b.html#appA