Если ваше приложение работает с важными данными, то не плохо было быпозаботиться о безопасности. Особенно остро вопрос безопасности стоитдля телефонов и КПК, которые могут быть украдены или просто утеряны. Втаких устройствах обычно хранится много персональной информации,которую злоумышленник может использовать в своих целях. Поэтому всегданужно помнить о безопасности и защищать личные данные.
Модель безопасности MIDP построена таким образом, что одинмидлет не может получить доступ к данным другого мидлета (конечно, еслиони вместе не входят в один набор: MIDlet suit). Также запрещаетсядинамически загружать новые классы из сети. Помимо системных классов,мидлет может использовать лишь классы, входящие в JAR архив. Если Вамтребуется большая безопасность, например защита ценной информации, Выдолжны сами запрограммировать ее.
Простейший способ защитить информацию в мидлете - разрешитьработу с информацией только после ввода пользователем пароля. Вы можетезапрашивать пароль каждый раз при запуске мидлета или при первомобращении к данным. Также Вы можете запрашивать пароль повторно привыполнении "опасных" операций.
Проще всего организовать запрос пароля, используя классTextBox или TextField. Оба этих класса входят в пакетjavax.microedition.lcdui. TextBox создает новое окно, имеющеезаголовок, строку текста и поле ввода. Если вам нужны какие-то другиекомпоненты пользовательского интерфейса, воспользуйтесь TextField.TextField - поле ввода текста, которое можно разместить на форме. Форма- это окно, на котором можно размещать различные компонентыпользовательского интерфейса. TextBox и TextField имеют идентичныйинтерфейс, поэтому все приведенное ниже справедливо для обоихкомпонентов.
Перед тем как перейти к коду, давайте ответим на один вопрос:какой тип пароля использовать: литерный или цифровой? Вы, вероятно,выберите первый вариант, поскольку именно он используется накомпьютерах. Но на самом деле наиболее разумен второй вариант. Помните,что клавиатура телефона состоит только из цифр, и для ввода буквытребуется несколько раз нажать ту или иную клавишу. Это достаточноутомительно, кроме того, пользователь должен видеть текст, которыйвводит, что значительно снижает безопасность. Цифровой пароль прощевводить. Конечно, он уступает буквенному по защищенности от перебора,но эта проблема решается увеличением длинны пароля.
Ниже приведен код запроса пароля с использованием TextBox.
// Приведенный класс реализует запрос
// числового пароля у пользователя.
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
public class PasswordPrompter
extends TextBox
implements CommandListener {
private Display display;
private Displayable next;
private int pin;
// Конструктор с заданным по умолчанию заголовком
public PasswordPrompter( int pin,
intmaxchars,
Displaydisplay,
Displayablenext ){
this( defaultTitle, pin, maxchars,
display, next );
}
// Конструктор с определенным заголовком
public PasswordPrompter( String title,
intpin,
intmaxchars,
Displaydisplay,
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,
Displayabled ){
String pinStr = getString();
try {
if( Integer.parseInt( pinStr ) == pin ){
display.setCurrent( next );
return;
}
}
catch( NumberFormatException e ){
}
Alert alert = new Alert( "Error!",
"Invalidpassword",
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.*;
public class PasswordTester extends MIDlet
implementsCommandListener {
private Display display;
private Command exitCommand
= new Command( "Exit", Command.EXIT, 1 );
public PasswordTester(){
}
protected void destroyApp( boolean unconditional )
throwsMIDletStateChangeException {
exitMIDlet();
}
protected void pauseApp(){
}
protected void startApp()
throwsMIDletStateChangeException {
if( display == null ){ // первый вызов...
initMIDlet();
}
}
private void initMIDlet(){
display = Display.getDisplay( this );
// Запрос пароля
new PasswordPrompter( 1234, 4, display,
newTrivialForm() );
}
public void exitMIDlet(){
notifyDestroyed();
}
public void commandAction(
Commandc, Displayable d ){
exitMIDlet();
}
// Экран, отображающийся при правильном пароле
class TrivialForm extends Form {
TrivialForm(){
super( "MainApp" );
addCommand( exitCommand );
setCommandListener( PasswordTester.this );
}
}
}
Подставлять строку пароля непосредственно в конструктор не оченьудобно. Лучше создать для правильного пароля переменную. В таком случаедля хранения значения пароля можно использовать RSM (record storemaintained) либо создать свойство в манифесте/дескрипторе мидлета.Чтобы загрузить значение свойства необходимо воспользоваться методомgetAppProperty:
MIDlet midlet = ....;
int password;
try {
String p = midlet.getAppProperty( "Password" );
password = Integer.parseInt( p );
}
catch( NumberFormatException e ){
}
Используя свойство можно создавать уникальный пароль для каждогопользователя. Например, при загрузке мидлета с вашего сервера, Выможете изменить значение свойства пароля и посылать пользователю парольна e-mail.
Надо сказать, что описанный нами способ обеспечивает достаточнонизкий уровень защиты, поскольку для того чтобы узнать парольдостаточно прочитать файл манифеста/дескриптора. Это может сделатьлюбой, обладающий знанием и желанием. Данные из RSM также могут бытьпрочитаны. Если защищаемая информация действительно для Вас важна,храните ее в зашифрованном виде.