2017-05-02 82 views
0

我们正在使用scala中的“com.didisoft.pgp.PGPLib”帮助解密PGP文件。 这是工作正常与本地文件,但当我们运行它的HDFS文件,我们面临的问题,如“文件未找到异常安全key”解密HDFS上的PGP文件

即使尝试与gix的unix实用程序相同的事情,我们遇到了一个文件未找到当HDFS文件的路径通过时发出问题。

下面是做工精细的本地文件多数民众赞成示例代码:

val decryptionPassword = "xxxx" 
val sec = "C:/Users/path/secring.gpg" 
val originalFileName =pgp.decryptFile("C:/Users/path/pgp_sample_file.PGP",sec, 
     decryptionPassword ,"C:/Users/path/opfile/PGP.txt") 

我们如何使用这些工具来解密我们的文件躺在HDFS?

回答

0

您不能像普通文件系统那样访问hdfs。您需要将文件下载到本地系统,然后使用本地文件,或者打开流或将文件加载到内存中,然后对其进行解密。

要使用GPG命令行

hdfs dfs -cat <hdfs_file_path> | gpg --batch --yes --passphrase <passphrase> -d 

我不能回答如何与Java库这样做(这似乎是私有的),但有可能是一个办法接受一个I​​nputStream,而不是的文件名。

为了得到一个HDFS文件的InputStream的,你需要使用hadoop fs api

val fs = org.apache.hadoop.fs.FileSystem.get(new org.apache.hadoop.conf.Configuration()) 
val inputStream = fs.open(new org.apache.hadoop.fs.Path(<filepath>)) 
0

基于从puhlen示例代码,我可以建议你试试这个:

val pgp = new com.didisoft.pgp.PGPLib() 
val decryptionPassword = "xxxx" 
val fs = org.apache.hadoop.fs.FileSystem.get(new org.apache.hadoop.conf.Configuration()) 
val keysStream = fs.open(new org.apache.hadoop.fs.Path("hdfs://.../secring.gpg")) 

val ks = new com.didisoft.pgp.KeyStore() 
ks.importKeyRing(keysStream) 

val inputData = fs.open(new org.apache.hadoop.fs.Path("hdfs://.../pgp_sample_file.PGP")) 
val outputData = fs.create(new org.apache.hadoop.fs.Path("hdfs://.../PGP.txt")) 

val originalFileName = pgp.decryptStream(inputData, ks, 
     decryptionPassword, outputData) 

别忘了用正确的HDFS路径替换点