Java-шифрование, альтернативное жестко закодированному ключу - PullRequest
9 голосов
/ 06 июля 2010

Я новичок в шифровании.

Я посмотрел документацию 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();

Однако если выесли бы я был умным хакером (или, может быть, даже любителем, так как я понял это), все, что вам нужно было бы сделать, это открыть файл класса, содержащий этот код, и ключ шифрования (My Encryption Key98) отчетливо виден.* Как вы шифруете ключ шифрования?... LOL ... Можешь?

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

Ответы [ 8 ]

6 голосов
/ 06 июля 2010

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

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

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

3 голосов
/ 06 июля 2010

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

1 голос
/ 06 июля 2010

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

1 голос
/ 06 июля 2010

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

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

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

0 голосов
/ 09 февраля 2013

самый безопасный метод - не использовать шифрование, просто поместите ваши user.properties в ваш домашний каталог со следующим кодом:

String userhome = System.getProperty("user.home");
String username = system.getProperty("user.name");
String hostname = java.net.InetAddress.getLocalHost().getHostName();

if (hostname.equals("webserver") && username.equals("root")){
ResourceBundle user = ResourceBundle.getBundle(userhome/ "user.properties");
}
0 голосов
/ 06 июля 2010

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

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

0 голосов
/ 06 июля 2010

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

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

0 голосов
/ 06 июля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...