首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果密码在运行openssl -apr1命令时包含美元($)字符,则无法获得所需的结果

问如果密码在运行openssl -apr1命令时包含美元($)字符,则无法获得所需的结果
EN

Stack Overflow用户
提问于 2020-05-28 13:04:13
回答 1查看 567关注 0票数 0

我正在运行以下命令来为Linux终端上给定的密码生成散列。

代码语言:javascript
复制
openssl passwd -apr1 'Test123$Pwd' 
$apr1$lWLP.Qc0$f/YdAVqsYFglu1EnLvzUS.

我编写了一个简单的shell脚本,它为给定的密码生成一个散列。下面是我的shell脚本:(是否应该修改shell脚本中的任何内容,以包含围绕$1的单引号)

回声-n " $1“\ openssl -apr1 $1

现在,问题是,当我从java程序调用相同的shell脚本时,由于某种原因,如果密码包含一个美元($)字符,它就不能像预期的那样工作。

下面是我的java代码,它调用上面的shell脚本:

代码语言:javascript
复制
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代码包含一个单引号如下所示:

代码语言:javascript
复制
"sh test.sh '%s'";

在具有单引号的日志中观察到下面的命令,当我从java运行shell脚本时,这也不起作用。

代码语言:javascript
复制
openssl passwd -apr1 'Test123$Pwd'

在Linux终端上,当我运行脚本时,它工作得很好。

代码语言:javascript
复制
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中的其他内容感到困惑?

任何指示都会有帮助。谢谢!

EN

回答 1

Stack Overflow用户

发布于 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轻松地做到这一点。

所以,我的建议是:

  1. 重新考虑apr1。太不安全了,你不会想要的。使用bcrypt、scrypt或pbkdf2。可能是地窖。
  2. 停止通过一个主管来耕种这份工作,用爪哇来做。例如,使用jBCrypt。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62065451

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档