android/java如何使用电子邮件地址加密布尔变量

android/java如何使用电子邮件地址加密布尔变量,android,encryption,Android,Encryption,我想在私有共享首选项中存储一个布尔变量。我想添加一些安全性,至少,对于根设备来说,不需要简单地修改布尔变量。我正在考虑使用电子邮件地址来加密布尔值。我读了一些stackoverflow,我可以将其转换为char[](这是什么??)然后用一个键进行xor(??)?我真的不懂加密理论,谁能提供一些示例代码来“用电子邮件地址加密布尔变量”?谢谢加密布尔值?真有趣 好的,你可以用很多不同的方法来隐藏 你可以使用一个数字(比如700)或一个字符串(比如“倪浩”),然后对照一个数字(如果你保存的数字是900

我想在私有共享首选项中存储一个布尔变量。我想添加一些安全性,至少,对于根设备来说,不需要简单地修改布尔变量。我正在考虑使用电子邮件地址来加密布尔值。我读了一些stackoverflow,我可以将其转换为char[](这是什么??)然后用一个键进行xor(??)?我真的不懂加密理论,谁能提供一些示例代码来“用电子邮件地址加密布尔变量”?谢谢

加密布尔值?真有趣
好的,你可以用很多不同的方法来隐藏

你可以使用一个数字(比如700)或一个字符串(比如“倪浩”),然后对照一个数字(如果你保存的数字是9009,那么它是真的,否则它是假的-在这个例子中,700不是9009,所以你会得到假的)或一个字符串(如果你保存的字符串是“倪浩”,那么它是真的,否则它是假的-在这个例子中,“倪浩”是“倪浩”,所以你会得到真实的答案),仅列举两种常见且简单的方法

你的幻想就是你的极限。
即使我仍然必须看到隐藏布尔值的意义,这是一个位

我读了一些stackoverflow,我可以将其转换为char[](这是什么??)然后用一个键进行xor(?)?我真的不懂加密理论。。。嗯,一点也不

任何人都可以提供一些示例代码来“加密带有电子邮件地址的布尔变量”。“倪浩”的例子就可以了。用一封电子邮件代替“倪浩”就行了(显然是假的,比如“example@no_address.com)完成。

选项1:用户jBCrypt 从下载最新的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);
    encryptor = new SampleEncryptor(myActivity);
    encryptor.encryptBoolean(false);
并将结果存储在SharedReferences中

问题是在哪里安全地存储密码或电子邮件。所以我们有选择2

选项2:适用于Android 4.3及以上版本 扩展此示例以扩展它并创建一个加密程序,如下所示

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

然后你可以做类似的事情

    String encryptedBoolean = BooleanEncryptor.encrypt("email@example.com", true);
    encryptor = new SampleEncryptor(myActivity);
    encryptor.encryptBoolean(false);

因为它是一个布尔值,如果它是真的,你可以把它设为假,如果它是假的,你可以把它设为真。