【问题标题】:Gpg4win: Avoid passphrase prompt, in java codeGpg4win:避免密码短语提示,在 java 代码中
【发布时间】:2016-04-01 12:56:09
【问题描述】:

我已经创建了一个 SSIS 包,它正在使用一个执行进程任务,在这个任务中,一个批处理文件正在被执行。此批处理文件正在执行一个 java CLass 文件。 java 代码从目录中读取 PGP 文件,然后导入私钥并执行 gpg filename.gpg 命令。成功执行后,它会提示输入密码。

gpg --allow-secret-key-import --import PrivateKey.gpg
gpg filename.gpg
提示输入密码

我想要实现的是避免这个提示,在我的 java 代码中自动化解密过程。那么是否存在一个命令,通过该命令我可以在没有提示的情况下输入密码。

Prompt Issue Image

这是我的java代码

private void decryptFiles(String encryptedFilePath, String keyFilePath){
    try{
        //location to encrypted gpg file
        File encryptedFileLocation = new File(encryptedFilePath);
        //location for key file that will be loaded
        File keyFileLocation = new File(keyFilePath);

        //changing dir and loading key
        String []cmd = {"gpg", "--allow-secret-key-import --import Key.gpg"};  

        ProcessBuilder builder = new ProcessBuilder(cmd);

        Runtime runtime = Runtime.getRuntime();
        Process p = runtime.exec(cmd, null, keyFileLocation);

        AutoDecrypter decrypterObj = new AutoDecrypter();
        if(p!=null)
            decrypterObj.displayCommandPromptOutput(p);
        else 
            System.out.println("Unable to create Process");

        if(encryptedFileLocation.isDirectory()){
            //all file with gpg extension will be stored in this array
            File[] allGpgFiles = encryptedFileLocation.listFiles(decrypterObj.new GpgFileFilter());
            builder.directory(encryptedFileLocation);
            cmd = new String[2];

            cmd[0] = "gpg";
            for(File f : allGpgFiles){
                //taking feed files and decrypting them one by one
                String fileName = (f.getName()).substring(0,(f.getName()).length()-4);

                cmd[1] = "--output D:\\AutoDecrypt_Feeds\\feed\\"+f.getName()+" --passphrase 123 --symmetric D:\\AutoDecrypt_Feeds\\feed\\"+fileName;

                System.out.println((f.getName()).substring(0,(f.getName()).length()-4));
                builder.command(cmd);
                p = builder.start();

                decrypterObj.displayCommandPromptOutput(p);
                System.out.println("- Decrypted");  
            }

        }else{
            System.out.println("Enter a directory!!");
        }

    }catch(Exception e){
        System.out.println(e);
    }
}

private void displayCommandPromptOutput(Process p) throws IOException {
    //output of command prompt is displayed
    BufferedReader bfr = new BufferedReader(new InputStreamReader(p.getInputStream()));
    String cmdOutuptTxt = "";
    while((cmdOutuptTxt=bfr.readLine())!=null){
        System.out.println(cmdOutuptTxt);
    }
}

//to get only gpg files from any directory
class GpgFileFilter implements FilenameFilter{
    @Override
    public boolean accept(File dir, String fileName) {
        return fileName.endsWith(".gpg");
    }  
}

这是我试过的,没有错误没有提示但它没有解密文件
cmd[0] = "gpg";
cmd1 = "--output D:\AutoDecrypt_Feeds\feed\"+f.getName()+" --passphrase 123 --symmetric D:\AutoDecrypt_Feeds\feed\"+fileName;

【问题讨论】:

    标签: java ssis gnupg


    【解决方案1】:

    你可以使用options to specify a passphrase:

    --passphrase-file 文件

    从文件文件中读取密码。只有第一行将从文件文件中读取。这只能在只有 提供了一个密码。显然,存储在文件中的密码 如果其他用户可以读取此文件,则其安全性值得怀疑。别 如果可以避免,请使用此选项。请注意,此密码仅 如果选项 --batch 也已给出,则使用。这不同于 GnuPG 版本 1.x。

    --密码字符串

    使用字符串作为密码。仅当仅提供一个密码时才能使用此功能。显然,这是非常 多用户系统上的安全问题。如果出现以下情况,请勿使用此选项 你可以避免它。请注意,此密码仅在选项 --batch 也已给出。这与 GnuPG 版本 1.x 不同。

    或者你可以generate a key without a passphrase

    请记住,这些都具有安全隐患,如文档中所述:如果您对自己正在做的事情不是很小心,这基本上相当于将房子的钥匙存放在门垫下。

    【讨论】:

      猜你喜欢
      • 2010-09-27
      • 1970-01-01
      • 2017-01-24
      • 2013-02-25
      • 1970-01-01
      • 1970-01-01
      • 2018-01-27
      • 2013-06-18
      • 2017-10-08
      相关资源
      最近更新 更多