0

我有课:

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中数据的序列化不是问题,我已经这样做了,但是没有加密它)

我找不到任何适合我需要的解决方案。

编辑:根据对单个数据字段的 XML 进行加密的建议,什么应该是这样做的好方法?

4

3 回答 3

3

我会加密整个 XML - 出错的机会更少,并且需要更少的填充(您加密的每个字符串/字节数组可能需要多达 16 个字节的填充,具体取决于您使用的块模式,所以如果您加密一次完整的 XML,那么您将被限制为 16 个字节的填充,而如果您将其加密为八个单独的块,那么您最多可能有 128 个字节的填充)。 这是使用 AES 将字符串加密为字节数组的示例- 谷歌还有很多其他示例,请务必避免使用 ECB(电子密码本)模式的示例,因为此模式不安全。您可能还想在加密之前压缩 XML(加密后不要压缩它,这会浪费时间)。这将为您留下一个字节数组,如果您需要一个字符串,则使用Base64 编码器将字节数组转换为字符串。

正如 akostadinov 的回答中提出的那样,在加密数据时不应该重用初始化向量 - IV 需要是唯一的,但它不需要是秘密的(您可以/应该将其与加密数据一起存储)。

于 2013-06-25T13:54:00.143 回答
1

这取决于您的数据。据我所知,您将有很多重复的值,并且加密字段可能允许某人在不解密数据的情况下对数据做出结论(例如,查看加密序列匹配的位置)。您的应用程序似乎对安全性不敏感,但如果您加密整个 XML 或每条完整记录,那将比加密单个字段更好。

有一件事情要做,因为也许不同的用户会使用你的应用程序,它是在应用程序第一次启动时生成加密密钥。否则,您的所有用户都将拥有相同的加密密钥,这将破坏加密的目的。

于 2013-06-25T14:26:00.380 回答
1

您应该能够创建一个数据已全部加密的输出流。如果您关心安全性,则应该加密所有内容。这意味着在您的输出中不会有 XML 文件。它将是一组存储加密 XML 的字节。

如果您真的需要强大的安全性,我会使用两次加密文件。

第一遍是加密将写入字符串的数据。其次,使用加密数据在内存中创建 XML 文件并将其全部加密并写入输出。

第二步应该使用不同的密钥。

于 2013-06-25T14:39:07.887 回答