如何在 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
(总是相同的编码),应用程序应该在源代码中保留IV
和secret key
。
如何将它们存储在我的源代码中?
我试图在文件中写入 IV
和 secret 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
以便于使用。
我正在尝试解密 access token
(它是 String
),它用于默认访问 Dropbox 帐户并将文件上传到其中。所以现在,我总是需要 access token
来上传文件。
到目前为止,我一直在生成一个新的 initialization vector
(IV
) 和一个新的 secret key
来加密和解密 access token
。但是,我想将这两个存储在源代码中,作为常量variables/attributes。我希望它们保持不变的原因是什么?因为我会给用户一个加密的access token
(总是相同的编码),应用程序应该在源代码中保留IV
和secret key
。
如何将它们存储在我的源代码中?
我试图在文件中写入 IV
和 secret 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
以便于使用。