Я плохо знаком с шифрованием.
Я посмотрел на 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... Можете Вы?
Спасибо за помощь!
Если злоумышленник имеет доступ как к программному обеспечению, так и к файлу, он может его расшифровать. Есть несколько способов решить эту проблему:
Если программе необходимо как зашифровать, так и расшифровать данные, вы ничего не сможете сделать. Злоумышленник может просто запустить программу и посмотреть расшифрованную информацию.
Ну, если программа может расшифровать данные без дополнительного участия пользователя, вы не сможете избежать доступа к файлу, если у него есть доступ к программе.
Если вы нацелены только на Windows, вам стоит обратить внимание на Data Protection API (DPAPI). По сути, он делает то же самое, но парольная фраза, используемая для шифрования, защищена операционной системой на уровне пользователя (или машины). Проще говоря: вам нужен логин пользователя (или программы, которая работает под данной учетной записью пользователя), чтобы получить доступ к ключу (или для машинной области логин любого пользователя на машине).
Я не знаю, как получить доступ к API из Java, но Google предлагает несколько библиотек-оберток.
Злоумышленник всегда может сделать все, что может сделать программа, и обычно немного больше. Единственный способ обезопасить вещи - это информация об использовании, не находиваяся под контролем программы. Попросите пользователя ввести пароль или поместите информацию в хранилище под контролем операционной системы. Последний не поможет, если у злоумышленника есть физический доступ или, возможно, даже много прав, если не задействовано специальное оборудование, такое как доверенный платформенный модуль (TPM).
Не нужно жестко кодировать ключ. Если у вас нет под рукой пользователя для ввода ключевой фразы, настройте свой код на извлечение ключа шифрования из обычного файла, а затем положитесь на безопасность операционной системы, чтобы сохранить файл в безопасности. Предусмотрите возможность перехода на новый ключ, когда системный администратор сочтет это необходимым.
Я не верю, что это возможно без того, чтобы пользователь вводил ключ при шифровании и расшифровке.
Можно применить какую-то технику, чтобы затруднить просмотр ключа без полного исходного кода, но это будет небезопасно.
Если ваша программа может самостоятельно шифровать/дешифровать файл, то все необходимое для дешифровки уже встроено в программу, поэтому решительный нарушитель может расшифровать зашифрованные вами файлы.
Если возможно, спросите у пользователя "пароль" и используйте то, что он вам даст, в качестве ключа шифрования/дешифрования.
Важно ли, чтобы пользователь не мог видеть свой собственный ключ шифрования? Или просто важно, чтобы, узнав свой ключ, пользователь не узнал ключ всех остальных?
Вы можете попросить пользователя ввести личный ключ и либо хранить его снаружи, либо запрашивать его каждый раз, когда он вам нужен. Таким образом, ключ каждого пользователя был бы его собственным и не мог бы использоваться для расшифровки документов, хранящихся у других пользователей на других машинах.