我正在运行以下命令来为Linux终端上给定的密码生成散列。
openssl passwd -apr1 'Test123$Pwd'
$apr1$lWLP.Qc0$f/YdAVqsYFglu1EnLvzUS.我编写了一个简单的shell脚本,它为给定的密码生成一个散列。下面是我的shell脚本:(是否应该修改shell脚本中的任何内容,以包含围绕$1的单引号)
回声-n " $1“\ openssl -apr1 $1
现在,问题是,当我从java程序调用相同的shell脚本时,由于某种原因,如果密码包含一个美元($)字符,它就不能像预期的那样工作。
下面是我的java代码,它调用上面的shell脚本:
void test(String password){
String script = "sh test.sh %s";
String command = String.format(script, password);
- - -
execute(command); // execute using ProcessBuilder
- - -
}如果密码不包含美元字符,上述代码可以正常工作。但是,如果密码包含$ char,它会忽略$符号后面的文本,并为剩下的密码生成一个哈希,直到$为止。
例如:如果我以的形式传递密码,测试$Pwd
只为测试而不是Test$Pwd生成哈希
我尝试在java代码中设置单引号,如下所示,但这也不起作用。当出于某种原因使用java执行时,它仍然生成Test123的散列,而不是 hash 123$Pwd。
修改后的java代码包含一个单引号如下所示:
"sh test.sh '%s'";在具有单引号的日志中观察到下面的命令,当我从java运行shell脚本时,这也不起作用。
openssl passwd -apr1 'Test123$Pwd'在Linux终端上,当我运行脚本时,它工作得很好。
sh test.sh 'Test123$Pwd' -- this works
sh test.sh Test123$Pwd -- this doesn't work (generates hash only for Test123 even when run directly on the linux terminal)我对是否需要修改shell脚本或java中的其他内容感到困惑?
任何指示都会有帮助。谢谢!
发布于 2020-05-28 13:27:35
在shell脚本中,双引号是绕过被视为分隔符的空格的一种方法。它不排除变量替换。这就是你想要的;单引号将传递文字的$1,如美元,然后是1,而不是“替换这里脚本的第一个参数”。但是,在第二个没有引号的情况下,您可以直接传递$1。
但是,这在使用中对确切的shell有相当大的依赖性,并且打开了密码的大门,密码的某些符号会扰乱您的程序。
为什么不完全放弃shell脚本,直接调用openssl呢?您可以替换标准in (因此,发送回显在脚本中发送的内容),以及通过ProcessBuilder的List<String> / String...选项传递的args (不要使用单个字符串选项,实际上,它很难读懂,并要求java尝试将空格转换为分隔符,这里是个坏主意)--就像现在一样,在传递原始选项时,没有bash或任何您不希望它“解释”密码的shell。
或者,更好的是,为什么要调用shell脚本?
如果内存正常,apr1就是表示'MD5,执行了1000次‘的密钥。这是一个可怕的,因为它是一个琐碎的彩虹,哈希密码的方式。这也是您根本不需要openssl的东西,您可以通过java轻松地做到这一点。
所以,我的建议是:
https://stackoverflow.com/questions/62065451
复制相似问题