如何在Java中拥有恒定的初始化向量和秘密密钥?

时间:2018-08-19 05:05:22

标签: java encryption dropbox secret-key

我正在尝试解密access token(它是String),该密码用于默认访问Dropbox帐户并将文件上传到其中。因此,现在,我始终需要access token来上传文件。

直到现在,我一直在生成新的initialization vectorIV)和新的secret key来加密和解密access token。但是,我想将这两个作为常量变量/属性存储在源代码中。我为什么希望他们保持不变?因为我将给用户一个加密的access token(始终使用相同的编码),并且应用程序应将IVsecret key保留在源代码中。

如何将它们存储在源代码中?

我试图在文件中写入IVsecret key的字符串值。我使用文件中的字符串,并在代码中将字符串值分配给字符串常量。然后,我使用常量创建byte数组,以转换为IV和秘密密钥。我不确定这是否行得通,它仍在开发中。

1 个答案:

答案 0 :(得分:3)

您最好听取建议。存储密钥很不好,但是如果没有其他选择可用的话,有时可以进行保护。但是,通常没有理由使用静态IV。您可以将IV(大多数操作模式为16字节)添加到密文前面。

无论如何,要将它们存储为静态值,只需看下面的代码即可;请注意,您应该事先将它们生成为随机值,而不是在此处看到的静态值:

private static final byte[] KEY_DATA = {
    (byte) 0x00, (byte) 0x01, (byte) 0x02, (byte) 0x03,
    (byte) 0x04, (byte) 0x05, (byte) 0x06, (byte) 0x07,
    (byte) 0x08, (byte) 0x09, (byte) 0x0A, (byte) 0x0B,
    (byte) 0x0C, (byte) 0x0D, (byte) 0x0E, (byte) 0x0F,
};

private static final byte[] IV_DATA = {
    (byte) 0x00, (byte) 0x01, (byte) 0x02, (byte) 0x03,
    (byte) 0x04, (byte) 0x05, (byte) 0x06, (byte) 0x07,
    (byte) 0x08, (byte) 0x09, (byte) 0x0A, (byte) 0x0B,
    (byte) 0x0C, (byte) 0x0D, (byte) 0x0E, (byte) 0x0F,
};

public static void main(String[] args) throws Exception {
    Cipher aes = Cipher.getInstance("AES/CBC/PKCS5Padding");

    SecretKey key = new SecretKeySpec(KEY_DATA, "aes");
    IvParameterSpec iv = new IvParameterSpec(IV_DATA);

    aes.init(Cipher.ENCRYPT_MODE, key, iv);

    ...
}

请注意,SecretKeySpec实现了接口SecretKey,以方便使用。