Protezione di oggetti permanenti
BlackBerry Device Software fornisce due metodi principali per proteggere gli oggetti nella memoria permanente:
- Limitare l'accesso agli oggetti con la classe net.rim.device.api.system.ControlledAccess e le chiavi di firma codice.
- Crittografare e decrittografare gli oggetti con la classe net.rim.device.api.system.PersistentContent.
In base alle necessità dell'applicazione, è possibile utilizzare entrambi, uno solo o nessuno di questi approcci.
Limitazione dell'accesso agli oggetti permanenti
Gli oggetti che vengono memorizzati utilizzando la memoria permanente sono identificati da una chiave univoca, con valore di tipo long primitivo. Per recuperare un oggetto dalla memoria permanente, la chiave associata all'oggetto al momento della memorizzazione deve essere fornita nelle chiamate dei metodi. Ad esempio:
long key = 0x52834c0559055c3L; PersistentObject rec = PersistentStore.getPersistentObject(key); String stored_value = (String) rec.getContents();
Affidarsi a un valore di chiave sconosciuto può non fornire un livello appropriato di riservatezza delle informazioni memorizzate. Se si desidera consentire solo ad alcune applicazioni specifiche e autorizzate l'accesso ai dati delle proprie applicazioni, è necessario utilizzare PersistentObject in una classe net.rim.device.api.system.ControlledAccess insieme alla generazione della chiave e alla procedura di firma chiave:
- Creare una chiave di firma utilizzando BlackBerry Signing Authority Tool.
- Associare un oggetto ControlledAccess alla chiave di firma.
- Aggiungere PersistentObject all'oggetto ControlledAccess.
- Applicare la firma alle applicazioni che richiedono l'accesso ai dati protetti utilizzando la stessa chiave di firma che protegge i dati.
Di seguito, è riportato un esempio sulla modalità di recupero dei dati protetti con la classe ControlledAccess:
long key = 0x52834c0559055c3L;
try {
PersistentObject rec = PersistentStore.getPersistentObject(key);
int moduleHandle = ApplicationDescriptor.currentApplicationDescriptor().getModuleHandle();
CodeSigningKey codeSigningKey = CodeSigningKey.get( moduleHandle, "MDW" );
String b = (String) rec.getContents( codeSigningKey );
Dialog.inform("Read PersistentObject. Value="+b);
} catch (ControlledAccessException e) {
Dialog.alert("ControlledAccessException - not authorised to read this data");
}
Per ulteriori informazioni sulla limitazione dell'accesso agli oggetti permanenti, vedere Protezione degli oggetti permanenti dall'accesso da parte di applicazioni non autorizzate.
Per ulteriori informazioni sulla firma codice, vedere Guida a BlackBerry Java SDK per sviluppatori - Protezione, disponibile all'indirizzo www.blackberry.com/go/devguides.
Esempio di codice
Il file .cod del codice seguente deve essere firmato con la stessa chiave utilizzata come CodeSigningKey per proteggere i dati.
import net.rim.device.api.system.ApplicationDescriptor;
import net.rim.device.api.system.CodeSigningKey;
import net.rim.device.api.system.ControlledAccess;
import net.rim.device.api.system.PersistentObject;
import net.rim.device.api.system.PersistentStore;
import net.rim.device.api.ui.*;
public class ControlledAccessCreator extends UiApplication {
public static void main(String[] args) {
ControlledAccessCreator cac = new ControlledAccessCreator();
cac.enterEventDispatcher();
}
private ControlledAccessCreator() {
ControlledAccessCreatorScreen screen = new ControlledAccessCreatorScreen();
pushScreen(screen);
}
}
class ControlledAccessCreatorScreen extends MainScreen {
private MenuItem _initialiseMenuItem = new MenuItem("Initialise", 100, 10) {
public void run() {
String a = "Hello";
long key = 0x52834c0559055c3L;
PersistentObject rec = PersistentStore.getPersistentObject(key);
int moduleHandle = ApplicationDescriptor.currentApplicationDescriptor().getModuleHandle();
CodeSigningKey codeSigningKey = CodeSigningKey.get( moduleHandle, "MDW" );
rec.setContents(new ControlledAccess(a,codeSigningKey));
rec.commit();
String b = (String) rec.getContents( codeSigningKey );
Dialog.inform("Initialised... now try to acccess the data from another app");
invalidate();
}
};
ControlledAccessCreatorScreen() {
setTitle(new LabelField("ControlledAccess Demo",
LabelField.USE_ALL_WIDTH));
addMenuItem(_initialiseMenuItem);
}
public boolean onSavePrompt() {
return true;
}
public void close() {
super.close();
}
}
Il file .cod del codice seguente deve essere firmato con la stessa chiave utilizzata nell'esempio di codice precedente.
import net.rim.device.api.system.ApplicationDescriptor;
import net.rim.device.api.system.CodeSigningKey;
import net.rim.device.api.system.ControlledAccess;
import net.rim.device.api.system.ControlledAccessException;
import net.rim.device.api.system.PersistentObject;
import net.rim.device.api.system.PersistentStore;
import net.rim.device.api.ui.*;
public class ControlledAccessAuthorisedUser extends UiApplication {
public static void main(String[] args) {
ControlledAccessAuthorisedUser caau = new ControlledAccessAuthorisedUser();
caau.enterEventDispatcher();
}
private ControlledAccessAuthorisedUser() {
ControlledAccessAuthorisedUserScreen screen = new ControlledAccessAuthorisedUserScreen();
pushScreen(screen);
}
}
class ControlledAccessAuthorisedUserScreen extends MainScreen {
private MenuItem _readMenuItem = new MenuItem("Read protected data", 100, 10) {
public void run() {
long key = 0x52834c0559055c3L;
try {
PersistentObject rec = PersistentStore.getPersistentObject(key);
int moduleHandle = ApplicationDescriptor.currentApplicationDescriptor().getModuleHandle();
CodeSigningKey codeSigningKey = CodeSigningKey.get( moduleHandle, "MDW" );
String b = (String) rec.getContents( codeSigningKey );
Dialog.inform("Read PersistentObject. Value="+b);
} catch (ControlledAccessException e) {
Dialog.alert("ControlledAccessException - not authorised to read this data");
}
}
};
ControlledAccessAuthorisedUserScreen() {
setTitle(new LabelField("ControlledAccess Demo",
LabelField.USE_ALL_WIDTH));
addMenuItem(_readMenuItem);
}
public boolean onSavePrompt() {
return true;
}
public void close() {
super.close();
}
}
Restrizione dell'accesso ai dati della memoria permanente tramite le chiavi di firma codice
Le informazioni sono state utili? Inviateci i vostri commenti.