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

如何在java中拥有一个常量初始化向量和密钥?,java,encryption,dropbox,secret-key,Java,Encryption,Dropbox,Secret Key,我正在尝试解密一个访问令牌(它是一个字符串),用于默认访问Dropbox帐户并将文件上载到其中。所以现在,我总是需要访问令牌来上传文件 到目前为止,我一直在生成一个新的初始化向量(IV)和一个新的密钥,以加密和解密访问令牌。但是,我想将这两个变量作为常量变量/属性存储在源代码中。我希望它们保持不变的原因是什么?因为我会给用户一个加密的访问令牌(总是相同的编码令牌),并且应用程序应该在源代码中保留IV和密钥 如何将它们存储在源代码中 我试图在文件中写入IV和密钥的字符串值。我使用文件中的字符串,并

我正在尝试解密一个
访问令牌
(它是一个
字符串
),用于默认访问Dropbox帐户并将文件上载到其中。所以现在,我总是需要
访问令牌
来上传文件

到目前为止,我一直在生成一个新的
初始化向量
IV
)和一个新的
密钥
,以加密和解密
访问令牌
。但是,我想将这两个变量作为常量变量/属性存储在源代码中。我希望它们保持不变的原因是什么?因为我会给用户一个加密的
访问令牌
(总是相同的编码令牌),并且应用程序应该在源代码中保留
IV
密钥

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


我试图在文件中写入
IV
密钥的字符串值。我使用文件中的字符串,并将字符串值指定给代码中的字符串常量。然后我使用我的常量创建
字节
数组,用于转换为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
,以便于使用。

这听起来像是一个非常不安全的想法。让我先说一下,这是一个糟糕的想法,您也可以在没有初始化向量的情况下使用不同的加密系统。您可以编写一个程序,将任意二进制数据写入源代码。或者,从数据库中读取它。或者将其保存在属性文件中。不过,使用常量iv是个坏主意。应用程序是否有服务器端组件?您是否有用户注册流程,或者他们是匿名的?因为如果您可以通过服务器分发访问令牌(而不是将其存储在应用程序或客户端计算机上),或者甚至可以为每个用户创建一个单独的访问令牌,则会安全得多。@Thilo:我没有注册过程,也没有服务器。只是一个桌面本地应用程序,有时应该在dropbox上上传图像。我将尝试为每个用户创建一个单独的访问令牌。听起来是个好主意。我想当然地认为每个dropbox帐户只有一个访问令牌。如果这是主dropbox访问令牌,那么这些用户中的每一个都将能够看到彼此的上传?这听起来真的不是一个好计划。当然,您也可以看看StackOverflow上几乎每一个糟糕的代码示例:)