我想在私有共享首选项中存储一个布尔变量。我想添加一些安全性,至少,它不仅仅是为了一个root设备来简单地修改布尔变量。我想用电子邮件地址来加密布尔值。我读了一些stackoverflow,我可以转换为char [](这是什么??)然后xor(??)用一个键?我真的不知道加密理论,任何人都可以提供一些示例代码来“用电子邮件地址加密一个布尔变量”吗?感谢
答案 0 :(得分:1)
加密布尔值?多么有趣!!
好的,你可以用许多不同的方式来隐藏这样的东西。
你可以使用一个数字(比如说700)或一个字符串(比如“ni hao”),然后根据一个数字检查它(如果你保存的数字是9009那么它是真的,否则它是假的 - 在这个例子中,700不是9009,所以你得到假)或一个字符串(如果你保存的字符串是“你好”那么它是真的,否则它是假的 - 在这个例子中,“你好”是“你好”,所以你' d得到真实),仅举两个常见而简单的方法。
你的幻想是你的极限 即使我仍然必须看到隐藏布尔值的意义,这是一个单位。
我读了一些stackoverflow,我可以转换为char [](那是什么??)然后xor(??)用一个键?我真的不具备加密理论知识 ......好吧,不是为了单一的比特!!
任何人都可以提供一些示例代码来“使用电子邮件地址加密布尔变量”吗?。 “你好”的例子会做。只需用电子邮件(显然是伪造的,例如“example@no_address.com”)替换“ni hao”,你就完成了。
答案 1 :(得分:0)
从here
下载最新的jBCrypt加密器的示例代码:
public class BooleanEncryptor {
public String encryptBoolean(String password, boolean value){
String pass = password + (value?"1":"0");
return BCrypt.hashpw(pass, BCrypt.gensalt());
}
public Boolean decryptBoolean(String password, String encrypted){
if(BCrypt.checkpw(password, password+"1")){
return true;
}
if(BCrypt.checkpw(password, password+"0")){
return false;
}
return null;
}
}
然后您可以执行类似
的操作 String encryptedBoolean = BooleanEncryptor.encrypt("email@example.com", true);
并将结果存储在SharedPreferences中。
问题在于安全地存储密码或电子邮件。所以我们有选项2 ......
扩展此示例SecretKeyWrapper以扩展它并创建一个加密器,如下所示
public class SampleEncryptor extends SecretKeyWrapper{
private static final SecureRandom RANDOM = new SecureRandom();
private SharedPreferences pref;
private SecretKey secretKey;
private byte[] encryptedKey;
public SampleEncryptor(Context context)
throws GeneralSecurityException, IOException {
super(context, "myalias");
this.pref = context.getSharedPreferences("mySecretKeyStore", Context.MODE_PRIVATE);
String base64key = pref.getString("key", null);
if(base64key==null){
this.secretKey = KeyGenerator.getInstance("AES").generateKey();
this.encryptedKey = this.wrap(this.secretKey);
pref.edit().putString("key", Base64.encodeToString(encryptedKey, Base64.DEFAULT)).commit();
}else{
this.encryptedKey = Base64.decode(base64key, Base64.DEFAULT);
this.secretKey = this.unwrap(this.encryptedKey);
}
}
public byte[] encrypt(byte[] data) throws GeneralSecurityException{
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
return cipher.doFinal(data);
}
public byte[] decrypt(byte[] data) throws GeneralSecurityException{
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, secretKey);
return cipher.doFinal(data);
}
public String encryptBoolean(boolean value) throws GeneralSecurityException{
BigInteger i = new BigInteger(128, RANDOM);
if(value){
i = i.setBit(0);
}else{
i = i.clearBit(0);
}
byte[] encrypted = encrypt(i.toByteArray());
return Base64.encodeToString(encrypted, Base64.DEFAULT);
}
public Boolean decryptBoolean(String encrypted) throws GeneralSecurityException{
byte[] data = Base64.decode(encrypted, Base64.DEFAULT);
BigInteger i = new BigInteger(decrypt(data));
return i.testBit(0);
}
}
然后你可以做类似
的事情 encryptor = new SampleEncryptor(myActivity);
encryptor.encryptBoolean(false);