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

时间:2014-02-15 17:25:23

标签: android encryption

我想在私有共享首选项中存储一个布尔变量。我想添加一些安全性,至少,它不仅仅是为了一个root设备来简单地修改布尔变量。我想用电子邮件地址来加密布尔值。我读了一些stackoverflow,我可以转换为char [](这是什么??)然后xor(??)用一个键?我真的不知道加密理论,任何人都可以提供一些示例代码来“用电子邮件地址加密一个布尔变量”吗?感谢

2 个答案:

答案 0 :(得分:1)

加密布尔值?多么有趣!!
好的,你可以用许多不同的方式来隐藏这样的东西。

你可以使用一个数字(比如说700)或一个字符串(比如“ni hao”),然后根据一个数字检查它(如果你保存的数字是9009那么它是真的,否则它是假的 - 在这个例子中,700不是9009,所以你得到假)或一个字符串(如果你保存的字符串是“你好”那么它是真的,否则它是假的 - 在这个例子中,“你好”是“你好”,所以你' d得到真实),仅举两个常见而简单的方法。

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

我读了一些stackoverflow,我可以转换为char [](那是什么??)然后xor(??)用一个键?我真的不具备加密理论知识 ......好吧,不是为了单一的比特!!

任何人都可以提供一些示例代码来“使用电子邮件地址加密布尔变量”吗?。 “你好”的例子会做。只需用电子邮件(显然是伪造的,例如“example@no_address.com”)替换“ni hao”,你就完成了。

答案 1 :(得分:0)

选项1:用户jBCrypt

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 ......

选项2:适用于Android 4.3及更高版本

扩展此示例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);