Protezione di oggetti permanenti

BlackBerry Device Software fornisce due metodi principali per proteggere gli oggetti nella memoria permanente:

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

È possibile utilizzare le chiavi di firma codice per controllare l'accesso alla memoria permanente. In tal modo, è possibile limitare l'accesso o condividerlo con altre applicazioni su un dispositivo BlackBerry.

  1. Importare le classi e le interfacce richieste.
    import java.util.Hashtable;
    import net.rim.device.api.system.PersistentObject;
  2. Creare un ID hash per l'oggetto che si desidera memorizzare in un oggetto permanente.
    long MY_DATA_ID = 0x33abf322367f9018L;
    Hashtable myHashtable = new Hashtable();
  3. Memorizzare l'oggetto nell'oggetto permanente e proteggerlo con l'oggetto CodeSigningKey. Ad esempio, quando un'applicazione BlackBerry esegue la riga di codice seguente, solo i file .cod che sono firmati con il file RSAE .key possono leggere o sovrascrivere l'oggetto nell'oggetto permanente.
    persistentObject.setContents( new ControlledAccess( myHashtable, key ) );
  4. Assicurarsi che l'oggetto sia protetto e richiamare getContents utilizzando l'oggetto CodeSigningKey come parametro.
    Hashtable myHashtable = (Hashtable) persistentObject.getContents( key );

Le informazioni sono state utili? Inviateci i vostri commenti.