Segurança de objetos persistentes
O BlackBerry Device Software oferece duas maneiras principais de assegurar os objetos no armazenamento persistente:
- Restringir o acesso aos objetos com a classe net.rim.device.api.system.ControlledAccess e chaves de assinatura de código.
- Criptografar e descriptografar objetos com a classe net.rim.device.api.system.PersistentContent.
Dependendo das necessidades de seu aplicativo, você pode usar ambas, uma ou nenhuma dessas abordagens.
Restrição do acesso a objetos persistentes
Os objetos armazenados que usam o armazenamento persistente são identificados por uma chave exclusiva, que tem um valor do tipo primitivo long. Para recuperar um objeto do armazenamento persistente, a chave associada ao objeto armazenado deve ser fornecida em chamadas de método. Por exemplo:
long key = 0x52834c0559055c3L; PersistentObject rec = PersistentStore.getPersistentObject(key); String stored_value = (String) rec.getContents();
Confiar no valor chave desconhecido pode não fornecer a privacidade adequada para as informações armazenadas. Se desejar permitir que apenas aplicativos autorizados específicos acessem os dados do seu aplicativo, você deverá inserir o PersistentObject em uma classe net.rim.device.api.system.ControlledAccess junto com a geração de chave e um procedimento de assinatura da chave:
- Criar uma chave de assinatura usando o BlackBerry Signing Authority Tool.
- Associe um objeto ControlledAccess a uma chave de assinatura.
- Insira o PersistentObject no objeto ControlledAccess.
- Assine os aplicativos que exigem acesso aos dados protegidos usando a mesma chave de assinatura que protege os dados.
Aqui há um exemplo de como recuperar dados que estão protegidos com a 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");
}
Para obter mais informações sobre como restringir o acesso a objetos persistentes, consulte Proteger objetos persistentes do acesso por aplicativos não autorizados.
Para obter mais informações sobre assinatura de código, consulte o Guia de desenvolvimento de segurança do BlackBerry Java SDK, disponível em www.blackberry.com/go/devguides.
Exemplo de código
O arquivo .cod do código a seguir deve ser assinado com a mesma chave do CodeSigningKey para proteger os dados.
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();
}
}
O arquivo .cod do código a seguir deve ser assinado usando a mesma chave utilizada no código de exemplo acima.
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();
}
}
Restringir acesso a dados de armazenamento persistentes usando chaves de assinatura de código
Estas informações foram úteis? Gostaríamos de receber seus comentários.