我用加密文件 openssl
然后把它放在hdfs上,我使用aes/ecb、128位和salt选项,通过一些研究,我发现openssl使用pkcs5填充作为默认值,这些都是cryptofileloader类中的默认值。以下是我的加密过程:
# echo -n "password" > .pw
# openssl enc -aes-128-ecb -salt -in .pw -out .pw.enc
# hdfs dfs -put .pw.enc /user/user1/
sqoop版本是1.4.6
命令:
sqoop import \
-Dorg.apache.sqoop.credentials.loader.class=org.apache.sqoop.util.password.CryptoFileLoader \
-Dorg.apache.sqoop.credentials.loader.crypto.passphrase=sqoop \
--connect jdbc:oracle:thin:@host/database \
--username user1 \
--password-file /user/user1/.pw.enc \
--table db.table1 \
--hive-import \
--hive-overwrite \
--hive-table hivedb.table1 \
--hive-drop-import-delims
它给出:
17/03/08 15:10:37 WARN tool.BaseSqoopTool: Failed to load password file
java.io.IOException: Can't decrypt the password
at org.apache.sqoop.util.password.CryptoFileLoader.loadPassword(CryptoFileLoader.java:151)
at org.apache.sqoop.util.CredentialsUtil.fetchPasswordFromLoader(CredentialsUtil.java:81)
at org.apache.sqoop.util.CredentialsUtil.fetchPassword(CredentialsUtil.java:66)
at org.apache.sqoop.tool.BaseSqoopTool.applyCredentialsOptions(BaseSqoopTool.java:1042)
at org.apache.sqoop.tool.BaseSqoopTool.applyCommonOptions(BaseSqoopTool.java:997)
at org.apache.sqoop.tool.ImportTool.applyOptions(ImportTool.java:875)
at org.apache.sqoop.tool.SqoopTool.parseArguments(SqoopTool.java:435)
at org.apache.sqoop.Sqoop.run(Sqoop.java:131)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:179)
at org.apache.sqoop.Sqoop.runTool(Sqoop.java:218)
at org.apache.sqoop.Sqoop.runTool(Sqoop.java:227)
at org.apache.sqoop.Sqoop.main(Sqoop.java:236)
Caused by: javax.crypto.BadPaddingException: Given final block not properly padded
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:966)
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:824)
at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:436)
at javax.crypto.Cipher.doFinal(Cipher.java:2165)
at org.apache.sqoop.util.password.CryptoFileLoader.loadPassword(CryptoFileLoader.java:149)
... 12 more
Error while loading password file: Can't decrypt the password
我也尝试手动给出其他cryptofileloader参数,并将本地文件传递给 --password-file
.
我可以用 openssl
. 我不能用java程序解密(?)
我看到有一个问题与填充,但我不知道它是什么,以及如何加密文件与某种填充方法或其他什么做,我没有经验与加密。
还有 org.apache.sqoop.credentials.loader.crypto.iterations
类中的参数,它指示pbkdf2迭代的次数,但我不知道它是否改变了什么。
谢谢你的帮助。
2条答案
按热度按时间xdnvmnnf1#
正如simone的回答一样,openssl和java实现的加密算法是不同的。这就是为什么使用openssl可以毫无问题地解密(因为它再次调用自己的(不同的)算法)。
经过大量的挖掘,我从戴夫·汤普森那里找到了这样一个答案:
简而言之:openssl enc(对于raw没有-k)使用的不是pbkdf2;它几乎是pbkdf1,迭代次数为1。
似乎有两种方法可以解决这个问题:
a) 在java中找到一些可以解密openssl正在做什么的东西—在这个答案中的一篇文章中引用了一个java库“bouncycastle”(如果您乐于使用它而不是标准的加密文件),其中他们实现了与openssl使用的完全相同的算法。
或
b) 找到其他一些命令行实用程序来代替实现pbkdf2的openssl。在nabble.com的帖子中也提到了许多不同语言的实现。
(引用的关键观察结果应归功于dave)
busg9geu2#
我不是sqoop和hadoop的Maven,但从你的例外开始
我看了一下cryptofileloader.java的源代码
在我看来,事情与您所做的有些不同:密码存储在使用pbkdf2算法的加密文件中,这并不等同于应用aes-128-ecb。来自维基百科:
pbkdf2将伪随机函数(如基于散列的消息验证码(hmac))与salt值一起应用于输入密码或密码短语,并多次重复该过程以生成派生密钥,然后在后续操作中将其用作加密密钥。额外的计算工作使得密码破解更加困难,这被称为密钥拉伸。
无法从openssl命令行执行pbkdf2。我用java做了一个小测试,它可能是一个替代方案