Open ENUM

Open ENUM — система динамического электронного ключа, на основе пользовательского ключа-смешивания.

Начнем из далека.
У всем известной WebMoney, есть сервис E-NUM. Сервис позволяет производить авторизацию пользователей через СМС и систему «код-ответ».
Несколько дней назад, мне пришлось воспользоваться услугами сервиса E-NUM, а именно системой «код-ответ».

Для тех кто ни разу не пользовался или уже забыл, напомню алгоритм работы:
После регистрации, пользователю высылается СМС содержащая уникальный код и ссылку для загрузки java-приложения. Запустив данное приложение и введя свой уникальный код, можно пользоваться системой авторизации.
Когда вам необходимо авторизоваться на каком-либо сервисе WebMoney, вы выбираете как вариант авторизации E-NUM. Вы вводите свой логин и получаете «код-вопрос». Запускаете приложение на сотовом телефоне, вводите «код-вопрос» и получаете «код-ответ». Вводите его в форме авторизации, и если все правильно и вы владелец аккаунта, система вас пустит в свои лона.
Все это очень хорошо и замечательно, и тому кто это придумал «5+». Вот только одно «но». Система закрытая и используется только для сервисов WebMoney.

А ведь нам хочется OpenSource!
«Больная голова, ногам покоя не дает» — несколько часов фантазии и небольшой магии и что-то, отдаленно напоминающее WebMoney ENUM, мы получили.
Несколько дней тяжелой битвы с механизмом «сдвигов» и генерации кода, и готовая, работающая система.

Система не будет использовать СМС. Только приложение для генерации «кода-ответа»

Ну «готовая», это сильно сказано, система умеет:
  • Генерировать «код-ответ», на основании «кода-вопроса» и «сдвига».
  • Уникальность «кодов-ответов» на уровне одного «сдвига» (пользователя), более чем достаточная — 99.7%
  • Уникальность «кодов-ответов» на уровне одного «кода-вопроса» при разных «сдвигах», тоже радует — 99.6%
  • На данный момент, результат выводиться в следующих форматах (plain-text, json, xml, uri)
  • Код написан для максимальной совместимости с другими вариантами реализации (java, c++, pascal и т.д.), для создания клиентских-приложений
Механизм генерации кода-ответа
При инициализации, класс, создает трехмерный массив, со стороной 10, и заполняет его значениями от 000 до 999.
После выполняется «сдвиг»: за основу берется «код-сдвига» (уникальный код для каждого пользователя), перечисляется каждое его значение как единичная цифра. Из нее «магическим методом» генерируется 4 (четыре) числовых значения x1,y1,x2,y2 (координаты среза №1 и координаты среза №2), далее на основании этих координат происходит по парная смена срезов.
После такого перемешивания, мы получаем уникальный набор для данного «код-сдвига».

Далее, идет выборка данных: за основу берется «код-вопрос» (код, переданный пользователю для прохождения авторизации), перечисляется каждое его значение как единичная цифра. Из нее «магическим методом» (немного отличаются друг от друга) генерируется 3 (три) числовых значения x,y,z (координаты значения в трехмерном массиве). Каждый полученный результат заносится в массив.

После получения полного массива (количество значений соответствует количеству цифр в «коде-вопросе»), теперь будем работать с ним.
Перечисляем его значения и работаем с ними
Как описать текстом, слов не нашлось — по этому небольшая табличка:
123
456
789

на выходе
$outx = 1+4+7
$outy = 2+5+8
$outz = 3+6+9
$outalpha = 123+456+789


выходной результат получается из следующей формулы:
$STRINGLEN — длина «кода-вопроса»
$SHIFT — «код-сдвига»
$RESULT = (($outx * $STRINGLEN) + ($outy * $STRINGLEN) + ($outz * $STRINGLEN) + ($outalpha * $SHIFT))

(использование $SHIFT — дает максимальную уникальность и полную зависимость от «кода-сдвига»)

После всего этого ужаса, $RESULT — содержит «код-ответа»



Собственно, по делу:
  1. А нужно-ли оно?
  2. Если нужно, кто со мной? (одному, скучно и не интересно)

Работы хватит на всех:
  • Нужно четко зафиксировать и задокументировать алгоритм получения кода-ответа.
  • Оптимизировать, что оптимизируется.
  • Создать MIDP (думаю 1.0, для большей совместимости устройств), iPhone, Android — приложения.


Ответ на вопрос «А сколько мы на этом заработаем?»:

«Мы получим, моральное удовлетворение от проделанной работы, и радость от вида счетчика срабатывания системы» — короче, «полный OpenSource»!


Я знаю, что это CHAP и еже с ними.


Работающие исходники:
http://open-enum.mcarrow.ru/


Все жалующие принят посильное участие — пишите в комментарии.

3 комментария

avatar
  • MpaK
  • 0
Во, прикольная идея, и без эмуляции монгодб :) шучу…

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

А вот совет, что было бы неплохо из этого сделать сервис.

Главное всё же SSL включить и отдавать и принимать в разных форматах REST (JSON, XML, Plain), SOAP и XML::RPC тогда могла бы идея в народ пойти, если описать и приподнести-то…
avatar
SSL — вопрос, решающийся легко и быстро.
Различные форматы вывода — тоже не проблема (входящие форматы — тоже)
Самое главное — не одному этим заниматься. Так-то своих дел хватает, но хочется и этот проект продвинуть в сеть. Собрать-бы команду, 2-3 человека — было-бы веселее и быстрее пошло.

Есть еще проблемы с алгоритмом — на это нужен основной упор, сейчас сделать.
avatar
Различные форматы ввода, вывода — что-то я немного упустил.
Нужно будет сделать обработчик форматов входных, выходных данных.

Надо поднять проект (github, redmine) и расписать задачи.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.