Шифрование Java alternitive к hardcoded ключу

Я плохо знаком с шифрованием.

Я посмотрел на javax.crypto документацию и заставил шифрование файла работать с помощью этого кода...

File saveFile = new File("Settings.set");
        saveFile.delete();
        FileOutputStream fout = new FileOutputStream(saveFile);

        //Encrypt the settings
        //Generate a key
        byte key[] = "My Encryption Key98".getBytes();
        DESKeySpec desKeySpec = new DESKeySpec(key);
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
        SecretKey skey = keyFactory.generateSecret(desKeySpec);

        //Prepare the encrypter
        Cipher ecipher = Cipher.getInstance("DES");
        ecipher.init(Cipher.ENCRYPT_MODE, skey);
        // Seal (encrypt) the object
        SealedObject so = new SealedObject(this, ecipher);

        ObjectOutputStream o = new ObjectOutputStream(fout);
        o.writeObject(so);
        o.close();

Однако, если Вы были умным хакером (или возможно даже любитель, так как я понял это), все, что необходимо будет сделать, открыть файл класса, который содержит этот код, и ключ шифрования (Мое Шифрование Key98) явно видим.

Как Вы шифруете ключ шифрования?... LOL... Можете Вы?

Спасибо за помощь!

9
задан DRJTower 6 July 2010 в 05:25
поделиться

7 ответов

Если злоумышленник имеет доступ как к программному обеспечению, так и к файлу, он может его расшифровать. Есть несколько способов решить эту проблему:

  • Используйте асимметричные ключи. Зашифруйте файл открытым ключом, и его можно будет расшифровать только закрытым ключом. Это предполагает, что программе не нужно расшифровывать файл.
  • Используйте обмен Диффи-Хеллмана. Если вы хотите отправить зашифрованный фрагмент данных по сети, обе стороны могут установить ключ без ведома злоумышленника.

Если программе необходимо как зашифровать, так и расшифровать данные, вы ничего не сможете сделать. Злоумышленник может просто запустить программу и посмотреть расшифрованную информацию.

6
ответ дан 3 November 2019 в 00:58
поделиться

Ну, если программа может расшифровать данные без дополнительного участия пользователя, вы не сможете избежать доступа к файлу, если у него есть доступ к программе.

Если вы нацелены только на Windows, вам стоит обратить внимание на Data Protection API (DPAPI). По сути, он делает то же самое, но парольная фраза, используемая для шифрования, защищена операционной системой на уровне пользователя (или машины). Проще говоря: вам нужен логин пользователя (или программы, которая работает под данной учетной записью пользователя), чтобы получить доступ к ключу (или для машинной области логин любого пользователя на машине).

Я не знаю, как получить доступ к API из Java, но Google предлагает несколько библиотек-оберток.

1
ответ дан 3 November 2019 в 00:58
поделиться

Злоумышленник всегда может сделать все, что может сделать программа, и обычно немного больше. Единственный способ обезопасить вещи - это информация об использовании, не находиваяся под контролем программы. Попросите пользователя ввести пароль или поместите информацию в хранилище под контролем операционной системы. Последний не поможет, если у злоумышленника есть физический доступ или, возможно, даже много прав, если не задействовано специальное оборудование, такое как доверенный платформенный модуль (TPM).

3
ответ дан 3 November 2019 в 00:58
поделиться

Не нужно жестко кодировать ключ. Если у вас нет под рукой пользователя для ввода ключевой фразы, настройте свой код на извлечение ключа шифрования из обычного файла, а затем положитесь на безопасность операционной системы, чтобы сохранить файл в безопасности. Предусмотрите возможность перехода на новый ключ, когда системный администратор сочтет это необходимым.

1
ответ дан 3 November 2019 в 00:58
поделиться

Я не верю, что это возможно без того, чтобы пользователь вводил ключ при шифровании и расшифровке.

Можно применить какую-то технику, чтобы затруднить просмотр ключа без полного исходного кода, но это будет небезопасно.

0
ответ дан 3 November 2019 в 00:58
поделиться

Если ваша программа может самостоятельно шифровать/дешифровать файл, то все необходимое для дешифровки уже встроено в программу, поэтому решительный нарушитель может расшифровать зашифрованные вами файлы.

Если возможно, спросите у пользователя "пароль" и используйте то, что он вам даст, в качестве ключа шифрования/дешифрования.

0
ответ дан 3 November 2019 в 00:58
поделиться

Важно ли, чтобы пользователь не мог видеть свой собственный ключ шифрования? Или просто важно, чтобы, узнав свой ключ, пользователь не узнал ключ всех остальных?

Вы можете попросить пользователя ввести личный ключ и либо хранить его снаружи, либо запрашивать его каждый раз, когда он вам нужен. Таким образом, ключ каждого пользователя был бы его собственным и не мог бы использоваться для расшифровки документов, хранящихся у других пользователей на других машинах.

0
ответ дан 3 November 2019 в 00:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: