我有课:
public class Data{
private int time;
private double avgVelocity;
private double avgAcceleration;
private double avgRhythm;
private int ups;
private int [] pressures;
private double [] velocities;
private double [] accelerations;
public Data(int tm, double vel, double acc, double rtm, int up,
int [] press, double [] vels, double [] accs){
time = tm;
avgVelocity = vel;
avgAcceleration = acc;
avgRhythm = rtm;
ups = up;
pressures = press;
velocities = vels;
accelerations = accs;
}
public double getTime(){
return time;
}
...
}
该类存储来自设备的数据。此数据应存储在XML文件中,以便稍后附加到另一个文件中。
我必须具备的是即使附件可见,也要使存储数据的XML不可读。那么我应该加密变量的所有内容,然后将所有不可读的值存储在xml上吗?或者我应该将所有值存储在XML中,然后加密整个文件?或者有更好的方法来实现这一目标吗? (xml中的数据序列化不是问题,我已经这样做了,但是要加密它)
我找不到符合我需求的解决方案。
编辑:根据加密sigle数据字段的XML intead的建议,有什么好办法呢?答案 0 :(得分:3)
我会加密整个XML - 减少错误的机会,并且还需要更少的填充(您加密的每个字符串/字节数组可能需要最多16个字节的填充,具体取决于您使用的块模式,因此如果您一次加密整个XML,那么您将限制为16个字节的填充,而如果您在八个单独的块中加密它,那么您可能最多有128个字节的填充)。 Here is an example of using AES to encrypt a string to a byte array - 谷歌提供了大量其他示例,请务必避免使用ECB(电子密码本)模式的示例,因为此模式不安全。您可能还希望在加密XML之前压缩XML(在加密后不要压缩它,这将浪费时间)。这将为您提供一个字节数组,如果您需要一个字符串,那么使用Base64 encoder将字节数组转换为字符串。
正如akostadinov的回答所示,在加密数据时不应重复使用初始化向量 - IV需要是唯一的,但它不需要保密(您可以/应该将其与加密数据一起存储)。
答案 1 :(得分:1)
这取决于您的数据。据我所知,你会有很多重复的值,加密字段可能允许有人对数据做出结论,即使不解密它(例如查看加密序列匹配的位置)。 您的应用程序似乎对安全性不敏感,但如果您加密整个XML或每个完整记录,那么这比加密单个字段要好。
要做的一件事,因为可能不同的用户将使用您的应用程序,它是在第一次启动应用程序时生成加密密钥。否则,您的所有用户都将使用相同的加密密钥,这样就无法实现加密。
答案 2 :(得分:1)
您应该能够创建一个输出流,数据都已准备好加密。如果你关心安全,你应该加密一切。这意味着在您的输出中您将没有XML文件。它将是存储加密XML的字节集。
如果你真的需要强大的安全性,我会用两遍加密文件。
第一遍是加密将写入String的数据。 其次用加密数据在内存中创建XML文件并对其进行加密并写入输出。
第二步应该使用不同的密钥。