Крипта Python в OSX

У меня есть приложение Django, которое сбрасывает пароли пользователей Unix, работающие на компьютере с Ubuntu, но моя среда разработки - OS X, и я столкнулся с этой досадной ситуацией:

OS X:

>>> import crypt
>>> crypt.crypt('test','OS X:VFvON1xK

Linux:

>>> import crypt
>>> crypt.crypt('test','OS X:VFvON1xK

Из чтения Пидока дляcryptЯ видел, что он использует ОС для конкретныхcrypt реализации, поэтому я также протестировал следующий код в обеих системах с теми же результатами, что и Python:

#include <unistd.h>

int main() {
        char *des = crypt("test","OS X:VFvON1xK$ls4Zz4XTEuVI.1PnYm28.1");
        puts(des);
}

Как я могу иметь OS Xcrypt() реализация генерирует те же результаты, что и Linuxcrypt()?
И почему это не охватывается реализацией Python (как и следовало ожидать от таких случаев для кроссплатформенного развертывания)?

) '$1SoNol0Ye6Xk'

Linux:

>>> import crypt
>>> crypt.crypt('test','OS X:VFvON1xK$')
'OS X:VFvON1xK$SboCDZGBieKF1ns2GBfY50'

Из чтения Пидока дляcryptЯ видел, что он использует ОС для конкретныхcrypt реализации, поэтому я также протестировал следующий код в обеих системах с теми же результатами, что и Python:

#include <unistd.h>

int main() {
        char *des = crypt("test","OS X:VFvON1xK$ls4Zz4XTEuVI.1PnYm28.1");
        puts(des);
}

Как я могу иметь OS Xcrypt() реализация генерирует те же результаты, что и Linuxcrypt()?
И почему это не охватывается реализацией Python (как и следовало ожидать от таких случаев для кроссплатформенного развертывания)?

) 'OS X:VFvON1xK$SboCDZGBieKF1ns2GBfY50'

Из чтения Пидока дляcryptЯ видел, что он использует ОС для конкретныхcrypt реализации, поэтому я также протестировал следующий код в обеих системах с теми же результатами, что и Python:

#include <unistd.h>

int main() {
        char *des = crypt("test","OS X:VFvON1xK$ls4Zz4XTEuVI.1PnYm28.1");
        puts(des);
}

Как я могу иметь OS Xcrypt() реализация генерирует те же результаты, что и Linuxcrypt()?
И почему это не охватывается реализацией Python (как и следовало ожидать от таких случаев для кроссплатформенного развертывания)?

) '$1SoNol0Ye6Xk'

Linux:

>>> import crypt
>>> crypt.crypt('test','OS X:VFvON1xK$')
'OS X:VFvON1xK$SboCDZGBieKF1ns2GBfY50'

Из чтения Пидока дляcryptЯ видел, что он использует ОС для конкретныхcrypt реализации, поэтому я также протестировал следующий код в обеих системах с теми же результатами, что и Python:

#include <unistd.h>

int main() {
        char *des = crypt("test","OS X:VFvON1xK$ls4Zz4XTEuVI.1PnYm28.1");
        puts(des);
}

Как я могу иметь OS Xcrypt() реализация генерирует те же результаты, что и Linuxcrypt()?
И почему это не охватывается реализацией Python (как и следовало ожидать от таких случаев для кроссплатформенного развертывания)?

Ответы на вопрос(3)

Решение Вопроса

что Linux glibc по-разному обрабатывает пароли - соль пароля в Linux соответствует типу хеша, который он генерирует. OSX crypt () - это обычное шифрование DES (что ужасно).

glibc поддерживает множество алгоритмов хеширования (MD5, Blowfish, SHA-256 и т. д.).

Если мы посмотрим наcrypt.3 manpage, мы можем увидеть:

   If salt is a character string starting with the characters "$id$" followed by
   a string terminated by "$":

          $id$salt$encrypted

   then instead of using the DES machine, id identifies the encryption method
   used and this then determines how the rest of the password string is
   interpreted.  The following values of id are supported:

          ID  | Method
          ---------------------------------------------------------
          1   | MD5
          2a  | Blowfish (not in mainline glibc; added in some
              | Linux distributions)
          5   | SHA-256 (since glibc 2.7)
          6   | SHA-512 (since glibc 2.7)

Итак, учитывая эту информацию ... давайте возьмем ваш пароль из второго примера, используя крипт Linux

OS X:VFvON1xK$SboCDZGBieKF1ns2GBfY50' ('test', encrypted with salt=VFvON1xK)


1                       == MD5
VFvON1xK                == Salt
SboCDZGBieKF1ns2GBfY50  == Hashed password

К счастью для вас, есть кроссплатформенное решение для этого,passlib.hash.md5_crypt.

Вот как бы вы использовали это:

from passlib.hash import md5_crypt
hash = md5_crypt.encrypt("test",salt="VFvON1xK")
print hash

При запуске в Linux или OSX выдает glibc дружественный хэш пароля:

OS X:VFvON1xK$SboCDZGBieKF1ns2GBfY50

Идентичен оригиналу, произведенному на машине Linux.

 Filipe Pina24 окт. 2012 г., 18:21
Я надеялся, что для ядра будут доступны некоторые дополнительные настройкикрипта но passlib.hash.md5_crypt прекрасно работает! Спасибо

в OSX, вам нужна версия ospt crypt (), а если вы работаете в Ubuntu, она будет использовать crypt () в Ubuntu.

Это кроссплатформенное решение - Python использует криптосистему ОС для обеспечения совместимости в среде. Если бы Python использовал свой собственный crypt (), то хэши были бы такими же, но он работал бы на OSX, а не на Ubuntu (или наоборот)

Вы можете написать что-нибудь или найти модуль, который повторно реализует алгоритм хеширования, который crypt использует в каждой среде - но опять же, это побьет цель кроссплатформенности. Вы бы жестко запрограммировали свое приложение для работы на Ubunutu, в котором могут использоваться различные крипты не только из OSX, но и из других разновидностей Unix и BSD, таких как RedHat, FreeBSD и т. Д.

 Dmitry Dulepov28 июл. 2016 г., 21:23
Этот ответ на самом деле не отвечает на вопрос :( Например, я на OS X, я изучаю Python и пытаюсь использовать crypt (). Я ожидаю, что он выдаст те же результаты, что и версия Linux, потому что иначе это не имеет смысла сравнивать хеши, сгенерированные на разных платформах одним и тем же методом. Хэши не должны меняться на разных платформах, если криптографический хеш-метод одинаков.
 Petesh24 окт. 2012 г., 17:36
Я думаю, что проблема более неловкая в том, что вы не можете указать систему разработки Mac на общую базу данных разработки и заставить ее работать на внешних интерфейсах Linux, использующих ту же базу данных.
 Filipe Pina24 окт. 2012 г., 18:13
действительно, вы делаете точку зрения окрипта выполняя как надо для этой ОС, спасибо. Но я надеялся на ответ, который упомянул бы стандартную библиотеку Python для решения моей проблемы :)
 Jonathan Vanasco28 июл. 2016 г., 23:31
Как и в оригинальном постере, вы не понимаете ответ или технологию. Питонаcrypt не является криптографическим методом хеширования. Это просто вызов собственной операционной системыcrypt функция. Каждая ОС реализуетcrypt иначе, потому что это просто стандартный интерфейс для управления паролями базовой системы. Если вы хотите последовательно хешировать строки на разных платформах, вам нужно использовать один и тот же криптографический метод хеширования на каждой платформе - это означает, что вы не хотите использоватьcryptи вместо этого хотите использовать библиотеку hashlib или что-то подобное.

которая вызывает специфичные для glibc поведения крипт, которые недоступны в Mac OS X. На справочной странице crypt (3) в Debian 6:

Если соль - это строка символов, начинающаяся с символов «$ id $», за которыми следует строка, оканчивающаяся на «$» ... тогда вместо использования машины DES идентификатор идентифицирует используемый метод шифрования, а затем определяет, как остальные Строка пароля интерпретируется.

В ваших примерах на python вы говорите crypt использоватьid 1, что приводит к использованию MD5 вместо хеширования на основе DES. Там нет такого расширения в Mac OS X, гдеcrypt строго на основе DES. (Mac OS X'scrypt имеет свое собственное расширение - соль может быть 9-символьным массивом, начинающимся с подчеркивания, за которым следуют 4 байта числа итераций и 4 байта соли - что не имеет аналогов в реализации glibc.)

Если вы избегаетеcrypt расширения на обеих платформах и использовать традиционныеcrypt, в котором соль может быть только два байта, вы получите одинаковые результаты от функции на обеих платформах, например:

>>> crypt.crypt( "test", "S/" )
'S/AOO.b04HTR6'

Это очевидно ужасно с точки зрения безопасности. Попробуйте использовать что-то вродеpasslib или жеру-Bcrypt вместо. Любой из них значительно улучшит хеширование и надежность кроссплатформенности одновременно.

Ваш ответ на вопрос