gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 16:30:04 25 4
gpt4 key购买 nike

我正在运行以下命令来在 Linux 终端上生成给定密码的哈希值。

openssl passwd -apr1 'Test123$Pwd' 
$apr1$lWLP.Qc0$f/YdAVqsYFglu1EnLvzUS.

我编写了一个简单的 shell 脚本,可以为给定的密码生成哈希值。这是我的 shell 脚本:(我是否应该修改 shell 脚本中的任何内容以包含 $1 周围的单引号)

回显-n“$1”| openssl passwd -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
- - -
}

如果密码不包含美元字符,上面的代码可以正常工作。但是,如果密码包含 $ 字符,它会忽略 $ 符号后面的文本,并为剩余密码仅生成 $ 以内的哈希值。

例如:如果我将密码传递为 Test$Pwd

仅为测试而不是Test$Pwd生成哈希

我尝试在 java 代码中设置单引号,如下所示,但这也不起作用。当由于某种原因使用 java 执行时,它仍然生成 Test123 的哈希值,而不是 Test123$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中的某些内容?

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

最佳答案

在 shell 脚本中,双引号是一种避免空格被视为分隔符的方法。它不排除变量替换。这就是你想要的;单引号将传递文字 $1例如,美元,然后是 1,而不是“在此处替换脚本的第一个参数”。然而,您直接传递 1 美元,而无需第二次报价。

但是,这在很大程度上依赖于正在使用的确切 shell,并为带有某些符号的密码打开了大门,从而弄乱了您的程序。

为什么不完全放弃 shell 脚本并调用 openssl直接地?您可以替换中的标准(从而发送脚本中发送的 echo 内容),并通过 ProcessBuilder 传递参数。的List<String>/String...选项(永远不要使用单个字符串选项,真的,它很难阅读,并且要求 java 尝试将空格转换为分隔符,这里是个坏主意) - 因为现在您正在传递原始选项,而无需 bash 或您尝试使用的任何 shell “解释”您不希望它执行的密码。

或者,更好的是,为什么要调用 shell 脚本?

如果没记错的话,apr1 是表示“MD5,完成 1000 次”的加密 key 。这是一种可怕,因为它是简单的彩虹表和 splinter 的散列密码方式。这也是你根本不需要 openssl 的事情,你可以轻松地从 java 做到这一点。

所以,这是我的建议:

  1. 重新考虑 4 月 1 日。这是不安全的,你不想要它。使用 bcrypt、scrypt 或 pbkdf2。可能是 bcrypt。
  2. 停止通过执行人员来完成这项工作,用 Java 来完成。例如,使用 jBCrypt .

关于java - 如果运行 openssl passwd -apr1 命令时密码包含美元 ($) 字符,则无法获得所需结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62065451/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com