2013-08-07 3 views
-1

, поэтому я пишу эту программу, которая должна проверять хэш пароля в etc/shadow и сравнивать его с введенным пользователем паролем. Я пробовал шифровать пароль с помощью hashlib.sha512, но результат был не тот. Я думаю, что это соленое, но я не знаю, использует ли он универсальную соль или как я могу получать соль каждый раз.Python with etc/Shadow

tldr; Мне нужно, чтобы пользователь вводил пароль, а затем имел хэш программы и проверял его против тэга/тени. Есть идеи?

+2

Я не уверен, но, возможно, доступ к теневому файлу не требуется. Не можете ли вы использовать API своей операционной системы, чтобы попытаться войти в систему (как у вас есть имя пользователя и пароль)? Когда вы можете войти в систему, учетные данные являются хорошими, если нет, то это не так. – Hyperboreus

+0

Кроме того, '/ etc/shadow' не может быть даже понятным для обычного пользователя. – abarnert

ответ

3

Попробуйте https://pypi.python.org/pypi/pam. Первая ссылка в Google python pam. Посмотрите на диспетчер пакетов распространения для python-pam, если он существует. Else install with pip или easy_install.

Небольшой пример:.

>>> import pam 
>>> pam.authenticate('fred', 'fredspassword') 
False 
+0

Не уверен, почему этот голос проголосовали - я считаю его лучшим решением. Нет su/shadow/hash trickery и работает на серверах, которые используют разные авторизационные механизмы. Может быть, нужен пример? 'import pam; pam.authenticate ('fred', 'fredspassword')'. – tdelaney

+0

Это не работает на CentOs –

+0

@ user1377480, вы трассируете? Как вы это установили? Возможно, пропущенные зависимости или несовместимые версии библиотек. – eri

1

Поле PASSWD не только хэш SHA-512 пароля *

Это объясняется в crypt manpage. Формат $id$salt$hash, где id определяет хеш-метод (1 для MD5, 2a для Blowfish, 5 для SHA-256, 6 для SHA-512), salt определяет соль для использования с этим алгоритмом, а hash определяет, какой результат должен быть.

Как видно из manpage, вы можете передать все $id$salt$ функции crypt вместо salt, и он будет автоматически использовать соответствующий алгоритм. Это не было бы слишком сложно сделать, скажем, ctypes.


Во всяком случае, то, что вы делаете, - это почти наверняка плохая идея. Для доступа к /etc/shadow вам нужно будет работать как root, и вам нужно будет симулировать больше, чем просто проверку пароля, если вы действительно хотите проверить, что пользователь может войти в систему, и, конечно, вам нужно будет обрабатывать безопасный ввод и убедитесь, что вы не сохранили пароль в открытом тексте где-то и так далее. Это намного проще и безопаснее, просто дайте PAM выполнить эту работу за вас.


* Я считаю, что в теории, может быть-если он не начинается с $ это интерпретируется как некий унаследованной формат ... предположительно означает это интерпретируется как POSIX crypt с использованием алгоритма DES.

2
>>> import crypt 
>>> line = 'bob:$1$qda8YAO9$rBiov9uVJlH1/97cbcyEt.:15965:0:99999:7:::' 
>>> encript = line.split(':')[1] 
>>> encript 
--> '$1$qda8YAO9$rBiov9uVJlH1/97cbcyEt.' 

>>> i = encript.rfind('$') 
>>> salt = encript[:i] 
>>> salt 
--> '$1$qda8YAO9' 

>>> crypt.crypt('bob_password',salt) 
--> '$1$qda8YAO9$rBiov9uVJlH1/97cbcyEt.' 
>>> encript 
--> '$1$qda8YAO9$rBiov9uVJlH1/97cbcyEt.'