Насколько безопасна эта процедура? - PullRequest
1 голос
/ 18 февраля 2011

Я собираюсь использовать такой подход для хранения моего пароля:

  1. Пользователь вводит пароль
  2. Пароль соли приложения со случайным числом
  3. Затем зашифрованный пароль шифруется с помощью некоторого алгоритма шифрования произвольно выбранного массива данных (состоящего из заранее определенной таблицы символов / байтов)
    • для простоты можно использовать просто таблицу цифр, поэтому в случае цифр случайный массив будет просто достаточно длинным целым / большим целым числом.
  4. Затем сохраняю в БД соль (измененное значение) и зашифрованный массив

Чтобы проверить действительность пароля:

  1. Получение данного пароля
  2. Считать соль из БД и вычислить ключ дешифрования
  3. Попробуйте расшифровать зашифрованный массив
  4. Если успешно (в математическом среднем), сравнить дешифрованное значение побайтно
    • содержит только символы / байты из известной таблицы. Например, это целое число / biginteger? Если это так - пароль считается действительным

Что вы думаете об этой процедуре?

В двух словах, это своего рода альтернатива использованию хеш-функций ...

В этом подходе алгоритм шифрования собирается использоваться для вычисления необратимого значения.

EDIT

# Encrypt/decrypt function that works like this:
KEY=HASH(PASSWORD)
CYPHERTEXT = ENCRYPT(PLAINTEXT, KEY)
PLAINTEXT = DECRYPT(CYPHERTEXT, KEY)

# Encrypting the password when entered
KEY=HASH(PASSWORD)+SALT or HASH(PASSWORD+SALT)
ARRAY={A1, A2,... AI}
SOME_TABLE=RANDOM({ARRAY})
ENCRYPTED_TABLE = ENCRYPT(SOME_TABLE, KEY + SALT)

# Checking validity
DECRYPT(ENCRYPTED_TABLE, PASSWORD + SALT) == SOME_TABLE
if(SOME_TABLE contains only {ARRAY} elements) = VALID
else INVALID

Ответы [ 3 ]

2 голосов
/ 18 февраля 2011

Из того, что вы пишете, я предполагаю, что вы хотите сделать следующее:

# You have some encryption function that works like this
CYPHERTEXT = ENCRYPT(PLAINTEXT, KEY)
PLAINTEXT = DECRYPT(CYPHERTEXT, KEY)

# Encrypting the password when entered
ENCRYPTED_TABLE = ENCRYPT(SOME_TABLE, PASSWORD + SALT)

# Checking validity
DECRYPT(ENCRYPTED_TABLE, PASSWORD + SALT) == SOME_TABLE

Прежде всего: Ни один здравомыслящий человек не использовал бы такую ​​самодельную схему в производственной системе .Так что, если вы задумывались о реализации этого в реальном мире, пожалуйста, вернитесь.Даже не пытайтесь писать код самостоятельно, используйте проверенную программную библиотеку, которая реализует общепринятые алгоритмы.

Теперь, если вы хотите думать об этом как о ментальном упражнении, вы можете начать так:

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

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

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

1 голос
/ 21 февраля 2011

Предложенная схема в лучшем случае немного менее безопасна, чем простое хранение хэша пароля и соли.

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

0 голосов
/ 18 февраля 2011

При каждом входе в систему вам придется использовать грубое шифрование каждого пароля.

Считать соль из БД и вычислить ключ дешифрования

Это невозможно сделать, если вы не знаете, какой пароль у вас под рукой.

Просто солью (и несколько хешей) пароль.

...