如何在 java 中有一个常量初始化向量和密钥?

How to have a constant initialization vector and secret key in java?

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

到目前为止,我一直在生成一个新的 initialization vector (IV) 和一个新的 secret key 来加密和解密 access token。但是,我想将这两个存储在源代码中,作为常量variables/attributes。我希望它们保持不变的原因是什么?因为我会给用户一个加密的access token(总是相同的编码),应用程序应该在源代码中保留IVsecret key

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

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

你最好听从建议。存储密钥是不好的,但如果没有其他选项可用,有时可以保护它。然而,通常没有理由使用静态 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 以便于使用。