Gpg4win:在java代码中避免使用passphrase提示符

时间:2016-04-01 12:56:09

标签: java ssis gnupg

我创建了一个SSIS包,它正在使用Execute Process任务。在此任务中,批处理文件正在执行。该批处理文件正在执行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”;
cmd 1 =“ - 输出D:\ AutoDecrypt_Feeds \ feed \”+ f.getName()+“ - passphrase 123 --symmetric D:\ AutoDecrypt_Feeds \ feed \”+ fileName;
< / p>

1 个答案:

答案 0 :(得分:0)

您可以使用options to specify a passphrase

  

- 密码短文件

     

从文件文件中读取密码。只从文件文件中读取第一行。这只能用于   提供一个密码短语。显然,密码存储在一个文件中   如果其他用户可以读取此文件,则安全性有问题。唐&#39;吨   如果可以避免,请使用此选项。请注意,此密码只是   如果还给出了选项--batch,则使用。这不同于   GnuPG版本1.x.

     

- 密码短语

     

使用字符串作为密码。仅在仅提供一个密码短语时才能使用此选项。显然,这是非常的   多用户系统的可疑安全性。如果,请不要使用此选项   你可以避免它。请注意,此密码仅在选项时使用    - 也已经给出了补丁。这与GnuPG版本1.x不同。

或者你可以generate a key without a passphrase

请记住,这些都有安全隐患,如文档中所述:如果您对自己所做的事情不是很谨慎,那么它基本上相当于将密钥存储到您的在你的门垫下的房子。