我正在尝试解密access token
(它是String
),该密码用于默认访问Dropbox帐户并将文件上传到其中。因此,现在,我始终需要access token
来上传文件。
直到现在,我一直在生成新的initialization vector
(IV
)和新的secret key
来加密和解密access token
。但是,我想将这两个作为常量变量/属性存储在源代码中。我为什么希望他们保持不变?因为我将给用户一个加密的access token
(始终使用相同的编码),并且应用程序应将IV
和secret key
保留在源代码中。
如何将它们存储在源代码中?
我试图在文件中写入IV
和secret key
的字符串值。我使用文件中的字符串,并在代码中将字符串值分配给字符串常量。然后,我使用常量创建byte
数组,以转换为IV和秘密密钥。我不确定这是否行得通,它仍在开发中。
答案 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
,以方便使用。