Если ваше приложение работает с важными данными, то не плохо было бы позаботиться о безопасности. Особенно остро вопрос безопасности стоит для телефонов и КПК, которые могут быть украдены или просто утеряны. В таких устройствах обычно хранится много персональной информации, которую злоумышленник может использовать в своих целях. Поэтому всегда нужно помнить о безопасности и защищать личные данные.
Модель безопасности MIDP построена таким образом, что один мидлет не может получить доступ к данным другого мидлета (конечно, если они вместе не входят в один набор: MIDlet suit). Также запрещается динамически загружать новые классы из сети. Помимо системных классов, мидлет может использовать лишь классы, входящие в JAR архив. Если Вам требуется большая безопасность, например защита ценной информации, Вы должны сами запрограммировать ее.
Простейший способ защитить информацию в мидлете - разрешить работу с информацией только после ввода пользователем пароля. Вы можете запрашивать пароль каждый раз при запуске мидлета или при первом обращении к данным. Также Вы можете запрашивать пароль повторно при выполнении "опасных" операций.
Проще всего организовать запрос пароля, используя класс TextBox или TextField. Оба этих класса входят в пакет javax.microedition.lcdui. TextBox создает новое окно, имеющее заголовок, строку текста и поле ввода. Если вам нужны какие-то другие компоненты пользовательского интерфейса, воспользуйтесь TextField. TextField - поле ввода текста, которое можно разместить на форме. Форма - это окно, на котором можно размещать различные компоненты пользовательского интерфейса. TextBox и TextField имеют идентичный интерфейс, поэтому все приведенное ниже справедливо для обоих компонентов.
Перед тем как перейти к коду, давайте ответим на один вопрос: какой тип пароля использовать: литерный или цифровой? Вы, вероятно, выберите первый вариант, поскольку именно он используется на компьютерах. Но на самом деле наиболее разумен второй вариант. Помните, что клавиатура телефона состоит только из цифр, и для ввода буквы требуется несколько раз нажать ту или иную клавишу. Это достаточно утомительно, кроме того, пользователь должен видеть текст, который вводит, что значительно снижает безопасность. Цифровой пароль проще вводить. Конечно, он уступает буквенному по защищенности от перебора, но эта проблема решается увеличением длинны пароля.
Ниже приведен код запроса пароля с использованием TextBox.
// Приведенный класс реализует запрос // числового пароля у пользователя. import javax.microedition.lcdui.*; import javax.microedition.midlet.*; publicclass PasswordPrompter extends TextBox implements CommandListener{ private Display display; private Displayablenext; private int pin; // Конструктор с заданным по умолчанию заголовком public PasswordPrompter( int pin, int maxchars, Display display, Displayablenext){ this( defaultTitle, pin, maxchars, display,next); } // Конструктор с определенным заголовком public PasswordPrompter( String title, int pin, int maxchars, Display display, Displayablenext){ super( title,"", maxchars, TextField.NUMERIC| TextField.PASSWORD); addCommand( okCommand); setCommandListener( this); this.display= display; this.next=next; this.pin= pin; display.setCurrent( this); } // Обрабатываем командные события. Сверяем введенный // пароль с pin. Если все нормально, пользователь // отправляется на следующее окна, если нет - // выводим предупреждение. public void commandAction( Command c, Displayable d){ String pinStr= getString(); try{ if( Integer.parseInt( pinStr)== pin){ display.setCurrent(next); return; } } catch( NumberFormatException e){ } Alert alert=new Alert("Error!", "Invalid password", null, AlertType.ERROR); setString(""); display.setCurrent( alert, this); } private static final Command okCommand= new Command("OK", Command.OK,1); private static final String defaultTitle= "Enter Password"; }
Для использования этого класса, создайте объект, передав ему правильный пароль, максимальную длину пароля, экземпляр экрана мидлета, и экран, который отображается при правильном вводе пароля. Ниже приведен простой мидлет, иллюстрирующий использование класса.
import javax.microedition.lcdui.*; import javax.microedition.midlet.*; publicclass PasswordTesterextends MIDlet implements CommandListener{ private Display display; private Command exitCommand =new Command("Exit", Command.EXIT,1); public PasswordTester(){ } protected void destroyApp( boolean unconditional) throws MIDletStateChangeException{ exitMIDlet(); } protected void pauseApp(){ } protected void startApp() throws MIDletStateChangeException{ if( display==null){// первый вызов... initMIDlet(); } } private void initMIDlet(){ display= Display.getDisplay( this); // Запрос пароля new PasswordPrompter(1234,4, display, new TrivialForm()); } public void exitMIDlet(){ notifyDestroyed(); } public void commandAction( Command c, Displayable d){ exitMIDlet(); } // Экран, отображающийся при правильном пароле class TrivialFormextends Form{ TrivialForm(){ super("MainApp"); addCommand( exitCommand); setCommandListener( PasswordTester.this); } } }
Подставлять строку пароля непосредственно в конструктор не очень удобно. Лучше создать для правильного пароля переменную. В таком случае для хранения значения пароля можно использовать RSM (record store maintained) либо создать свойство в манифесте/дескрипторе мидлета. Чтобы загрузить значение свойства необходимо воспользоваться методом getAppProperty:
MIDlet midlet=....; int password; try{ String p= midlet.getAppProperty("Password"); password= Integer.parseInt( p); } catch( NumberFormatException e){ }
Используя свойство можно создавать уникальный пароль для каждого пользователя. Например, при загрузке мидлета с вашего сервера, Вы можете изменить значение свойства пароля и посылать пользователю пароль на e-mail.
Надо сказать, что описанный нами способ обеспечивает достаточно низкий уровень защиты, поскольку для того чтобы узнать пароль достаточно прочитать файл манифеста/дескриптора. Это может сделать любой, обладающий знанием и желанием. Данные из RSM также могут быть прочитаны. Если защищаемая информация действительно для Вас важна, храните ее в зашифрованном виде.
Автор оригиналаEric Giguere.
Перевод:aRix