PHP - Ищем двусторонний способ запутывания для хранения телефонных номеров - PullRequest
0 голосов
/ 21 сентября 2011

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

I 'Мы думали о произвольной схеме, такой как сохранение числа * 15 или некоторой константы, которую знает только мое приложение.

Какие есть лучшие способы сделать это?

РЕДАКТИРОВАТЬ: НекоторыеВещи, которые я хотел бы уточнить:

  1. Сохраненные номера телефонов можно использовать для входа в приложение iPhone - поэтому я хочу, чтобы пользователи могли видеть, к какому номеру они подключилиськ сервису, если они хотят войти в приложение с другим номером позже.Это означает, что я не могу хэшировать значение.

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

РЕДАКТИРОВАТЬ: Чтобы уточнить, я не аутентифицируюсь на ТОЛЬКО номере телефона.В случае реализации это будет номер телефона + пароль!Введите одну строку цифр, которые могут существовать, и вы в?LOL - мои извинения, если я ввел в заблуждение некоторых людей.

Ответы [ 6 ]

6 голосов
/ 21 сентября 2011

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

В MySQL это было бы так просто, как:

INSERT INTO users (phone) VALUES (AES_ENCRYPT('yourkey', '867-5309'));

конечно, теперь вы изменили проблему с сокрытия телефонных номеров на "где @ $ @ # $ @# я могу спрятать этот ключ? "Очевидное решение: спрятать ключ под камнем за пределами входной двери вашего сервера.Что превращает проблему в «где @ # @ # $ @ # @% я могу спрятать этот камень?».Очевидное решение: закройте передний двор стальной клеткой с замком на двери.Новая проблема: как спрятать ключ замка ... и т. Д.

2 голосов
/ 21 сентября 2011

Как насчет реального шифрования?В этом сценарии хороший алгоритм симметричного шифрования является тривиальным, поскольку длина полезной нагрузки ограничена 10 цифрами, так что вы можете обойтись ключом, который также имеет длину 10 десятичных цифр;используя такой ключ, все, что вам нужно сделать, это что-то вроде XOR или increment / mod 10 для каждой цифры.Конечно, слабым звеном в этой схеме является то, как вы храните ключ.

Мне любопытно, однако, почему вам нужно вернуть их обратно - если это для аутентификации:

  1. вы не должны использовать телефонные номера, поскольку их легко найти, даже автоматически
  2. вы должны хранить безопасные односторонние хеши с отдельными солями, чтобы вы не могли даже вернуть ихесли хочешь (кроме как путем грубого принуждения)
1 голос
/ 21 сентября 2011

Используя Класс шифрования , вы можете сделать это:

$phone = '...';
$key = 'secret.for.each.number';
$phone = Cipher::encrypt($phone, $key);

Перед сохранением в базе данных.Затем вы можете вытащить его и сделать следующее:

$phone = Cipher::decrypt($phone, $key);
0 голосов
/ 21 сентября 2011

Это не очень хороший подход к безопасности.Несколько вещей бросаются в глаза:

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

  2. Любое двустороннее шифрование может быть взломано, это так просто.Если вам нужно легко дешифровать данные в базе данных, единственное преимущество шифрования заключается в том, что кто-то взломает вашу базу данных и заберет информацию.Как уже отмечали другие, если это произойдет, у вас есть большие проблемы.Другой сценарий предназначен для сотрудников, которые могут иметь действительный доступ к БД.Если вы скрываете данные от них, важно каким-то образом закодировать информацию.Но умножение номера телефона на «неизвестную» константу не является идеальным.Используйте лучший метод.

  3. Конечно, я знаю номера моего друга, чтобы я мог взломать чей-либо аккаунт, правильно?Вам нужно добавить компонент пароля, если вы этого еще не сделали.Пароль должен быть односторонним шифрованием с использованием сильной и уникальной соли.После добавления вам нужно только зашифровать телефонные номера в БД, если вы не хотите, чтобы ваши сотрудники видели их.В противном случае вы тратите время на их шифрование.

0 голосов
/ 21 сентября 2011

Нет смысла в этом вопросе.

Просто оставьте эти номера телефонов как есть.От такого запутывания вы не получите никакого улучшения безопасности

0 голосов
/ 21 сентября 2011

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

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

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

...