Как предоставить права администратора Java-программе во время выполненияJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как предоставить права администратора Java-программе во время выполнения

Сообщение Anonymous »

У меня есть Java-программа, из которой я хотел бы получить доступ к файлу, требующему прав администратора. Я использую IntelliJ IDE для разработки и хотел бы запустить программу из IDE.
У меня есть EncryptionModule с двумя методами void encrypt(Stringpassword, StringbaseName) и void decrypt (строка пароля, строка имени базы данных). Методы принимают пароль и путь к файлу, предоставленные пользователем. Должно быть возможно зашифровать/расшифровать файл csv или базу данных mysql.
Это работает с файлом csv, но для шифрования базы данных мне нужен доступ к таблице базы данных. База данных находится внутри Docker-контейнера, поэтому для доступа к таблице мне нужны права администратора.
Без прав администратора программа говорит: «Файл не существует». Каков результат выполнения else в предложении if в методе шифрования/дешифрования:
Path path = Paths.get(databaseName);
if (Files.exists(path)){
...
} else {
System.out.println("File does not exist");
}

Я уже пытался запустить IDE от имени пользователя root, но когда я открываю проект, IDE выходит из строя. И я бы предпочел решение без запуска всей IDE от имени пользователя root.
Как предоставить программе необходимые привилегии? Или есть другое решение того, что я хочу сделать?
ОС: Ubuntu, но оно должно работать и в Windows.
Код:
package com.example.passwordsafe.data;

import com.example.passwordsafe.core.usecases.EncryptionModuleInterface;

import javax.crypto.*;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.security.*;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;

public class EncryptionModule implements EncryptionModuleInterface {
private static final int ITERATION_COUNT = 1000000;
private static final int KEY_LENGTH = 256;
private static final String PBKDF_ALGORITHM = "PBKDF2WithHmacSHA1";
private static final String TRANSFORMATION = "AES/CBC/PKCS5Padding";
private static final String ALGORITHM = "AES";

@Override
public void encrypt(String password, String databaseName) {

Path path = Paths.get(databaseName);
if (Files.exists(path)){
File plaintextFile = new File(databaseName);
File encryptedFile = new File(databaseName + ".encrypted");

doEncryption(password, plaintextFile, encryptedFile);

plaintextFile.delete();

path = Paths.get(databaseName + ".encrypted");
try {
Files.move(path, path.resolveSibling(databaseName));
} catch (IOException e) {
throw new RuntimeException(e);
}

} else {
System.out.println("File does not exist");
}

}

@Override
public void decrypt(String password, String databaseName) {

Path path = Paths.get(databaseName);
if (Files.exists(path)){
File encryptedFile = new File(databaseName);
File plaintextFile = new File(databaseName + ".decrypted");

doDecryption(password, encryptedFile, plaintextFile);

encryptedFile.delete();

path = Paths.get(databaseName + ".decrypted");
try {
Files.move(path, path.resolveSibling(databaseName));
} catch (IOException e) {
throw new RuntimeException(e);
}

} else {
System.out.println("File does not exist");
}

}

private void doEncryption (String password, File inputFile, File outputFile) {
SecureRandom random = new SecureRandom();
byte[] salt = new byte[16];
random.nextBytes(salt);

KeySpec spec = new PBEKeySpec(password.toCharArray(), salt, ITERATION_COUNT, KEY_LENGTH);

try {
SecretKeyFactory factory = SecretKeyFactory.getInstance(PBKDF_ALGORITHM);
byte[] key = factory.generateSecret(spec).getEncoded();
SecretKeySpec keySpec = new SecretKeySpec(key, ALGORITHM);

byte[] ivBytes = new byte[16];
random.nextBytes(ivBytes);
IvParameterSpec iv = new IvParameterSpec(ivBytes);

Cipher cipher = Cipher.getInstance(TRANSFORMATION);
cipher.init(Cipher.ENCRYPT_MODE, keySpec, iv);

FileInputStream inputStream = new FileInputStream(inputFile);
byte[] inputBytes = new byte[(int) inputFile.length()];
inputStream.read(inputBytes);

byte[] encValue = cipher.doFinal(inputBytes);
byte[] finalCiphertext = new byte[encValue.length+2*16];
System.arraycopy(ivBytes, 0, finalCiphertext, 0, 16);
System.arraycopy(salt, 0, finalCiphertext, 16, 16);
System.arraycopy(encValue, 0, finalCiphertext, 32, encValue.length);

FileOutputStream outputStream = new FileOutputStream(outputFile);
outputStream.write(finalCiphertext);

inputStream.close();
outputStream.close();

} catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IllegalBlockSizeException |
IOException | BadPaddingException | InvalidKeySpecException | InvalidAlgorithmParameterException e) {
throw new RuntimeException(e);
}

}

private void doDecryption (String password, File inputFile, File outputFile) {
FileInputStream inputStream = null;
byte[] ivBytes = new byte[16];
byte[] salt = new byte[16];

byte[] readEncryptedBytesWithIvAndSaltPrefix;

try {
inputStream = new FileInputStream(inputFile);
readEncryptedBytesWithIvAndSaltPrefix = new byte[(int) inputFile.length()];
inputStream.read(readEncryptedBytesWithIvAndSaltPrefix);
} catch (IOException e) {
throw new RuntimeException(e);
}

byte[] inputBytes = new byte[readEncryptedBytesWithIvAndSaltPrefix.length - 32];

System.arraycopy(readEncryptedBytesWithIvAndSaltPrefix, 0, ivBytes, 0, 16);
System.arraycopy(readEncryptedBytesWithIvAndSaltPrefix, 16, salt, 0, 16);
System.arraycopy(readEncryptedBytesWithIvAndSaltPrefix, 32, inputBytes, 0, readEncryptedBytesWithIvAndSaltPrefix.length - 32);

KeySpec spec = new PBEKeySpec(password.toCharArray(), salt, ITERATION_COUNT, KEY_LENGTH);

try {
SecretKeyFactory factory = SecretKeyFactory.getInstance(PBKDF_ALGORITHM);
byte[] key = factory.generateSecret(spec).getEncoded();
SecretKeySpec keySpec = new SecretKeySpec(key, ALGORITHM);

IvParameterSpec iv = new IvParameterSpec(ivBytes);

Cipher cipher = Cipher.getInstance(TRANSFORMATION);
cipher.init(Cipher.DECRYPT_MODE, keySpec, iv);

byte[] encValue = cipher.doFinal(inputBytes);

FileOutputStream outputStream = new FileOutputStream(outputFile);
outputStream.write(encValue);

inputStream.close();
outputStream.close();

} catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IllegalBlockSizeException |
IOException | BadPaddingException | InvalidKeySpecException | InvalidAlgorithmParameterException e) {
throw new RuntimeException(e);
}

}
}

вызов метода в main:
String dbpath = "/var/lib/docker/volumes/d74a425c8728e5333a3472860c2b62a3e47a0b5655dd44cce1b4c47ac2c3b6b8/_data/password_safe/password_entries.ibd";
String password = "password";
encryptionModuleInterface.encrypt(password, dbpath);


Подробнее здесь: https://stackoverflow.com/questions/793 ... ng-runtime
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»