【问题标题】:Enrcrypt variables of a class before storing them in java在将类的变量存储在java中之前对其进行加密
【发布时间】:2013-06-25 23:03:12
【问题描述】:

我有课:

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 的建议,什么应该是一个好的方法呢?

【问题讨论】:

    标签: java xml class variables encryption


    【解决方案1】:

    我会加密整个 XML - 出错的机会更少,并且需要的填充也更少(根据您使用的块模式,您加密的每个字符串/字节数组可能需要多达 16 个字节的填充,所以如果您一次加密整个 XML,那么您将被限制为 16 个字节的填充,而如果您将其加密为 8 个单独的块,那么您最多可能有 128 个字节的填充)。 Here is an example of using AES to encrypt a string to a byte array - 谷歌还有很多其他示例,请务必避免使用 ECB(电子密码本)模式的示例,因为此模式不安全。您可能还想在加密之前压缩 XML(加密后不要压缩它,这会浪费时间)。这将为您留下一个字节数组,如果您需要一个字符串,则使用 Base64 encoder 将字节数组转换为字符串。

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

    【讨论】:

    • 您的意思是使用整个 XML 文本字符串并使用 AES 和 base64 编码器对其进行加密,不是吗?还是用所有数据组成一个唯一的字符串并将其用 AES 加密放在 xml 上? (对不起,如果这可能是一个愚蠢的问题,但我不熟悉加密等等)
    • @Igr 我假设您有办法将整个类序列化为 XML 字符串,因此您应该使用byte[] encryptedData = encrypt(compress(XMLSerialize(plaintextdata))),压缩步骤是可选的。如果你想要string 而不是byte[],那么你应该使用string base64Data = base64Encode(encrypt(compress(XMLSerialize(plaintextdata))))。之后是否将此字符串放入 XML 文件中取决于您,例如<encryptedData>data</encryptedData> - 此时已加密,所以你可以用它做任何事情。
    • @Igr 然后你反转整个过程以取回数据 - Data data = XMLDeserialize(decompress(decrypt(base64Decode(ciphertextdata))))
    • 是的,我有轻松序列化和反序列化所有数据的功能,我只是错过了加密步骤。无论如何,我想我明白了你的解释
    • @Igr 如果你真的需要一个字符串,你应该只使用 base64 编码器,因为这会增加大约 33% 的文件大小 - 只存储原始字节数组更有效。此外,某些协议会自动为您将字节数组转换为 base64 字符串。
    【解决方案2】:

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

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

    【讨论】:

    • 只要他不重复使用initialization vector,攻击者就不可能查看加密序列匹配的位置(例如,如果他们这样做匹配那么这将毫无意义)
    • 如果他相互独立地加密字段,并且如果他希望能够解密它们,即使部分序列由于某种原因消失了,我不明白他如何避免使用相同的加密相同输入值的字节。即使他正在对流进行加密,对于相同的输入数据,各个块是否相同也取决于密码变体。
    • 如果他使用 ECB,那么他会遇到你提到的问题,但如果他使用像 CBC 这样更安全的模式,那么为每个字段使用唯一的 IV 将防止攻击者关联不同的字段.他可以为每个字段存储一个单独的 IV,或者为了节省空间,他可以存储一个 IV 并为每个字段递增它 - IV 不是秘密,它只需要是唯一的。
    • 对,他可以用 IV 克服这个问题,但正如你在回答中所说的那样,更容易搞砸:)
    • 在我上一份工作中,他们坚持认为他们可以对所有内容使用全零 IV,因为“我们的数据不需要那么安全......”跨度>
    【解决方案3】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-24
      • 2020-08-16
      • 1970-01-01
      • 2018-03-01
      • 2017-03-15
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多