Sécurité des objets persistants

BlackBerry Device Software offre deux méthodes principales de protection des objets dans le stockage persistant :

Selon les besoins de votre application, vous pouvez utiliser les deux, une ou aucune de ces méthodes.

Restriction d'accès aux objets persistants

Les objets stockés dans le stockage persistant sont identifiés par une clé unique, dont la valeur est de type primitif long. Pour récupérer un objet du stockage persistant, la clé associée à l'objet lors de son enregistrement doit être fournie dans les appels de méthode. Par exemple :

long key = 0x52834c0559055c3L;
PersistentObject rec = PersistentStore.getPersistentObject(key);
String stored_value = (String) rec.getContents();

si la valeur de la clé est inconnue, il est possible que le niveau de confidentialité ne soit pas suffisant pour les informations stockées. Si vous souhaitez ne permettre qu'à certaines applications autorisées d'accéder à vos données applicatives, encapsulez l'objet PersistentObject dans la classe net.rim.device.api.system.ControlledAccess associée à la génération de clé et à une procédure de signature par clé :

  • Créez une clé de signature à l'aide de BlackBerry Signing Authority Tool.
  • Associez un objet ControlledAccess à la clé de signature.
  • Encapsulez l'objet PersistentObject dans l'objet ControlledAccess.
  • Signez les applications devant accéder aux données protégées à l'aide de la même clé de signature que celle protégeant les données.

Voici un exemple de la méthode de récupération de données protégés avec 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");
}

Pour plus d'informations sur la façon de limiter l'accès à des objets persistants, reportez-vous à la rubrique consacrée à la protection des objets persistants contre tout accès par des applications non autorisées.

Pour plus d'informations à propos de la signature de code, reportez-vous au BlackBerry Java SDK Security Development Guide (BlackBerry Java SDK - Guide de développement - Sécurité), disponible à l'adresse www.blackberry.com/go/devguides.

Échantillon de code

Le fichier .cod du code suivant doit être signé à l'aide de la clé utilisée en tant que CodeSigningKey pour protéger les données.

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();
  }
}

Le fichier .cod du code suivant doit être signé à l'aide de la clé utilisée pour l'échantillon de code précédant.

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();
  }
}

Limiter l'accès aux données de la base de stockage persistant à l'aide de clés de signature de code

Les clés de signature de code peuvent être utilisées pour contrôler l'accès à la base de stockage persistant. Cela constitue une méthode de limitation ou de partage de l'accès d'autres applications sur un terminal BlackBerry.

  1. Importez les classes et les interfaces requises.
    import java.util.Hashtable;
    import net.rim.device.api.system.PersistentObject;
  2. Créez un ID de hachage pour l'objet que vous souhaitez stocker dans un objet persistant.
    long MY_DATA_ID = 0x33abf322367f9018L;
    Hashtable myHashtable = new Hashtable();
  3. Stockez l'objet dans l'objet persistant et protégez l'objet avec l'objet CodeSigningKey. Par exemple, après qu'une application de terminal BlackBerry a exécuté la ligne de code suivante, seuls les fichiers de code signés avec le fichier .key RSAE peuvent lire ou remplacer l'objet dans l'objet persistant.
    persistentObject.setContents( new ControlledAccess( myHashtable, key ) );
  4. Assurez-vous que l'objet est protégé et appelez getContents en utilisant l'objet CodeSigningKey comme paramètre.
    Hashtable myHashtable = (Hashtable) persistentObject.getContents( key );

Ces informations vous ont-elles été utiles ? Envoyez-nous vos commentaires.