Конечно, возможен многоколонный поиск, но без использования VLOOKUP. Вам нужно будет использовать INDEX и MATCH. Это становится довольно сложным, так как объединяет формулы массива с логической логикой. Вот хорошее объяснение.
https://exceljet.net/formula/index-and-match-with-multiple-criteria
Для вашего примера, предположим, что требуемая компания результата находится в столбце I.
=INDEX($F$4:$F$5,MATCH(1,(D4:D5=I4)*(E4:E5="small"),0))
Для использования модуля склепа:
При ГЕНЕРАЦИИ crypted пароля Вы обеспечиваете соль. Это могло бы также быть случайно для увеличения сопротивления принуждению скота, пока это удовлетворяет перечисленным условиям. При ПРОВЕРКЕ пароля необходимо обеспечить значение от getpwname, в случае, если Вы находитесь в системе, которая поддерживает большие соленые размеры и не генерировала его сами.
Замечания общего порядка:
Если этому нечего делать с w/фактическими системными логинами, нет ничего препятствующего тому, чтобы Вы использовали более сильный метод, чем склеп. Вы могли случайным образом генерировать символы N соли в расчете на пользователя, чтобы быть объединенными с паролем пользователя в хеше SHA-1.
string_to_hash = user.stored_salt + entered_password
successful_login = (sha1(string_to_hash) == user.stored_password_hash)
ОБНОВЛЕНИЕ: В то время как это намного более безопасно против таблиц радуги, метод выше все еще имеет криптографические слабые места. Соответствующее приложение алгоритма HMAC может еще далее увеличить Вашу безопасность, но вне моей области экспертных знаний.
Вы неправильно понимаете документацию; это говорит, что, так как длина соли может варьироваться в зависимости от базового склепа () реализация, необходимо обеспечить весь crypted пароль как соленое значение при проверке паролей. Таким образом, вместо того, чтобы осуществить первые два символа, которые будут солью, просто встряхните во всем этом.
Ваша идея наличия начальной соли быть основанной на имени пользователя кажется хорошо.
Склеп Python () является оберткой для склепа системы () функция. От склепа Linux () страница справочника:
char *crypt(const char *key, const char *salt); key is a user’s typed password. salt is a two-character string chosen from the set [a–zA–Z0–9./]. This string is used to perturb the algorithm in one of 4096 different ways.
Акцент находится на "двух символьных строках". Теперь, если Вы смотрите на склеп () поведение в Python:
>>> crypt.crypt("Hello", "World")
'Wo5pEi/H5/mxU'
>>> crypt.crypt("Hello", "ABCDE")
'AB/uOsC7P93EI'
Вы обнаруживаете, что первые два символа результата всегда совпадают с первыми двумя символами исходной соли, которые действительно формируют сами истинную две символьных соли. Таким образом, результат склепа () имеет 2char-соль формы + зашифрованная передача. Следовательно, нет никакого различия в результате вместо того, чтобы передать две символьных соли или исходную много-соль символов при передаче целого зашифрованного пароля.
Примечание: набор [a–zA–Z0–9./] содержит 64 символа, и 64*64=4096. Вот то, как два символа касаются "4 096 различных путей".
Вот некоторые общие рекомендации по солению паролей:
У меня не было бы соли быть функцией пароля. Взломщик должен был бы генерировать таблицу радуги, чтобы иметь базу данных мгновенного поиска паролей, но они должны будут только сделать это однажды. Если бы Вы выбираете случайное 32-разрядное целое число, они должны были бы генерировать 2^32 таблицы, который (в отличие от детерминированной соли) стоит пути, слишком много памяти (и время).
Для некоторой добавленной силы можно заставить модуль склепа использовать md5 при помощи соли в формате.
$1$ABCDEFGH$
где ABCDEFGH является Вашей соленой строкой.
>>> p = crypt.crypt('password', '$1$s8Ty3/f$')
>>> p
Out: '$1$s8Ty3/f$0H/M0JswK9pl3X/e.n55G1'
>>> p == crypt.crypt('password', p)
Out: True
(обратите внимание, что это - расширение гну склепа, см. "склеп человека" в системе Linux). MD5 (и теперь даже SHA1) может быть "поврежден", но они все еще относительно хороши для хэшей пароля, и md5 является все еще стандартом для локальных паролей Linux.
Пароль, или что-либо произошло из пароля, никогда не должен использоваться в качестве соли. Соль для конкретного пароля должна быть непредсказуемой.
Имя пользователя или часть имени пользователя терпимы, но еще лучше были бы случайными байтами от криптографического RNG.
Смотрите на статью TrueCrypt, объясненную Björn Edström. Это содержит легкий понять объяснение того, как truecrypt работает и простая реализация Python части функциональности truecrypt включая управление паролями.
Он говорит о склепе Python () модуль, не о TrueCrypt в Python
Значение по умолчанию crypt.crypt()
в Python 2 не очень безопасно, и статья объясняет, как могли бы работать более безопасные альтернативы.
Используйте PBKDF2, посмотрите, этот комментарий к другому потоку (включает реализацию Python).