当前位置: 首页 > 面试题库 >

将硬编码文件解密为字节[]

贡俊
2023-03-14
问题内容

好吧,这实际上是两部分的…

首先我需要

  1. 读取文件内容
  2. 加密成一个 byte[]
  3. 将写入byte[]文件或其他任何内容…

然后,来自#2或#3的结果将进入另一个项目。我正在尝试保护我们的PEM / DER密钥。

对于解密,我需要

  1. 读取加密文件的内容为 byte[]
  2. 解密成一个 byte[]
  3. 将解密的数据写入文件或使用它代替文件
    现在,我有一些基本的加密代码

        KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
    keyGenerator.init(128); // 192 and 256 bits may not be available

    SecretKey secretKey = keyGenerator.generateKey();

    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");


    // By initializing the cipher in CBC mode, an "initialization vector" has been randomly
    // generated. This initialization vector will be necessary to decrypt the encrypted data.
    // It is safe to store the initialization vector in plain text for later use. You can obtain
    // it's bytes by calling iv.getIV().
    cipher.init(Cipher.ENCRYPT_MODE, secretKey);
    IvParameterSpec iv = cipher.getParameters().getParameterSpec(IvParameterSpec.class);
        //      IvParameterSpec iv = new IvParameterSpec(IV); //used for the hardcoded one

        byte[] encryptedData = cipher.doFinal(data);

并解密一个

    cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
    byte[] decryptedData = cipher.doFinal(encryptedData);
    System.out.println("decrypted: " + new String(decryptedData));

问题是:

给定一个用例场景,该场景很少会加密某些东西,而是分发要在运行时解密的加密密钥,除了密文,我还需要保存什么?

我知道我需要保存IV,但是解密时还不太好-这使我相信我也需要保存secretKey。

谁能给我任何提示,指针或一般安全提示,以寻求更好的解决方案?如果需要保存密钥,IV和加密数据,应将它们存储在哪里?也许对密钥进行硬编码并将IV连同加密数据一起存储?也许对IV和密钥都进行硬编码,然后将加密的数据存储在文件中?

这与理论安全性无关,可以认为这是您可能给试图窃取钥匙的人造成的最大麻烦和不便。我们都知道,我无法完美地隐藏它们。

我非常需要这个人从解密加密文件并在Java中执行开始

但是,如果有更好的方式将安全数据馈入PemKeyReader,我将不知所措。


问题答案:

共享密钥和加密某些东西是完全不同的两件事。如何分享金钥

话虽如此,AES使用128位元比使用128位元的加密算法要强大得多。3DES因此,您可以做的是保持PKI基础结构交换AES keys,然后使用它们进行加密和解密。

为什么不RSA呢?RSA需要最少512位才能将其视为最强,如果增加更多位,则将增加加密和解密所需的时间。

SO AES快速安全。

使用SecretKeySpec从字节创建密钥[]

public static void main(String[] args) throws Exception
{
    // Initialise secret key with predefined byte array [] like below. I
    // have used simple string to array method to generate 16 byte array.
    // AES Key must be minimum 16 bytes.
    // Now you can put this byte array some where is .SO file.
    // Generate new Key using this byte []
    // Then you can generate a key using device specific information at
    // first boot up.
    // Use second key to encrypt data and first key to encrypt the second
    // key
    // I Hope it clears all the doubts
    SecretKey key = new SecretKeySpec("ABCDEFGHIJKLMNOP".getBytes(), "AES");
    System.out.println(Arrays.toString(key.getEncoded()));
    // Initialise Cipher with AES Algorithm
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    // Set The Encrypt Mode
    cipher.init(Cipher.ENCRYPT_MODE, key);
    // Encrypt some bytes
    byte[] encrypted = cipher.doFinal("ABCDEFGH".getBytes());
    // Print it to vefiry
    System.out.println(Arrays.toString(encrypted));

    // Get The IV
    byte[] iv = cipher.getIV();
    System.out.println(iv.length);
    // Now why storing you can create structure like [16 IV][Encrypted Data]
    // And while decrypting you can read first [16] bytes IV and then
    // decrypt remaining bytes

    //byte[] iv = new byte[16];
    // System.arraycopy(encrypted, 0, iv, 0, 16)
    //Copy remaining bytes to decrypt


    // set cipher to decrypt mode

    cipher.init(Cipher.DECRYPT_MODE, key,new IvParameterSpec(iv));

    // decrypt it
    byte[] decrypted = cipher.doFinal(encrypted);
    System.out.println(new String(decrypted));

}

现在编写一种算法,该算法将从某些随机数据(例如设备名称,用户名,随机种子等)生成byte []。

您可以通过在算法源代码中编写该算法C并创建.SO文件并byte []使用来为其添加更多保护Native calls。

完成所有这些操作有什么好处?

  1. 如果您的黑客被黑客入侵,则需要实时环境来运行创建密钥。
  2. 即使有人破解了它,损坏也将是有限的,即1个设备
  3. 黑客将不得不对每台设备重复相同的操作,这几乎是不可能的。


 类似资料:
  • 有人请帮助我如何解决CWE-259:使用硬编码密码缺陷。

  • 目前,我们正在使用Checkmarx扫描应用程序代码。不确定Checkmarx是否检测/扫描源代码中的任何硬编码密码。是否需要在Checkmarx服务器上添加任何额外的配置来检测密码?

  • } 公共类GMailSender扩展javax.mail.authenticator{ } /**根据一个或多个*贡献者许可协议授权给Apache Software Foundation(ASF)。有关版权所有权的更多信息,请参阅与本作品一起分发的通知文件。*ASF根据Apache License,Version 2.0*(“License”)向您许可此文件;除非符合*许可证,否则您不得使用此文件

  • 问题: 做这件事的最佳方法是什么? 注: 编码:输入任意字符串;创建有效的文件名作为输出 decode:从encode获取文件名,恢复原始字符串

  • 问题内容: 我正在用Java实现与第三方应用程序的通信。作为登录过程的一部分,第三方应用程序正在发送一个加密的字符串,我必须对其进行解码并发回。我已经花了将近2天的时间进行糊涂和阅读文章,但是我找不到实现此目的的正确方法。 我有一个测试用例,其中加密的字符串为“ c1W2YO1vYQzu6czteEidrG0U4g5gT4h57vAlP7tdjcY =“,使用密码“ GAT”解密的字符串必须返回“

  • 我有一个编码为base64的SVG文件,我想用ImageView显示图像。这是我尝试过的: 但是decodedByte总是返回null。 附注: 此代码适用于jpeg图像。 如果Bas64字符串包含Bas64前缀("data: Image/svg xml; Bas64,"或"data: Image/jpeg; Bas64,),则decdedByte也总是返回null Bas64字符串是正确的(它在