【问题标题】:Finding issue while running CURL with encrypted password使用加密密码运行 CURL 时发现问题
【发布时间】:2017-01-03 16:49:27
【问题描述】:
我正在尝试使用加密密码运行以下 CURL 命令
curl --digest -L -D - http://localhost:9991/management --header "Content-Type: application/json" -d '{"operation" : "composite", "address" : [], "steps" : [{“操作”:“添加”,“地址”:{“部署”:“testtde.war”},“内容”:[{“url”:“文件:/home/ec2-user/test1.war” }]},{“操作”:“部署”,“地址”:{“部署”:“testtde.war”}}],“json.pretty”:1}' -u 管理员:$1$xyz$9uJTsPowG。 xkq8xKpVBrP。
我已经使用以下两种方法加密了密码
-
openssl passwd -1 -salt xyz Test12$ Test12$ 是我要加密的密码
echo Test12$ | base64
但它不起作用,如果我提供普通密码,它可以工作,但从上述两种方法产生的加密密码不知何故不起作用。
我在 Linux 机器上运行这个,
有什么帮助吗?
【问题讨论】:
标签:
curl
encryption
openssl
base64
【解决方案1】:
我不知道您正在与哪个应用程序通信,但这是有道理的。
OpenSSL passwd 命令散列输入,它不会加密它。这似乎是一种迂腐的区别,但对于理解这里实际发生的事情和原因非常重要。 加密是一种可逆保护操作,需要对秘密材料(即密钥)的特殊知识(在不需要密钥的情况下可逆地保护数据称为编码,并包括 Base64、十六进制等)。最后,散列是一种不可逆保护操作,不需要秘密数据。散列的要点是使用确定性算法获取一些输入数据并将其转换为输出数据,从这些数据中很难(阅读:数学上不太可能)确定原始输入。
为什么它用于密码存储而不是加密?因为为了加密和解密原始密码,您需要一个加密密钥。如果恶意实体获得此加密密钥的访问权限,他们就可以访问所有原始密码。同样,如果他们可以暴力破解其中一个密码并恢复该密钥,他们就会获得所有密码。相反,通过散列原始密码,泄漏/被盗的“散列”不会暴露原始原始密码,并且应用程序可以在提供登录时评估原始密码,而无需存储原始密码(因为散列函数是确定性的并且将始终返回相同的输入输出相同的输出)。
具体来说,passwd -1 告诉 OpenSSL 使用“基于 MD5 的 BSD 密码算法 1”。虽然这不是一个非常强大的散列算法,但由于它的早期使用它很常见。您的第二次尝试只是对原始密码进行 Base64 编码。
现在,当您发送原始密码但两种转换都没有时,它起作用的原因如下 - 应用程序将执行将您的原始(原始)密码转换为散列形式所需的任何散列操作。如果您尝试以这种散列形式提供密码,它将无法验证,因为H(x) != H(H(x)) -- 散列的散列不等于原始散列(对于任何重要且设计良好的散列函数) .您需要将原始密码发送到应用程序才能成功进行身份验证(您也可以研究“客户端哈希”,但它几乎总是与服务器端哈希一起用于资源平衡,而不是作为替代品)。
我在这里的要点是,当您通过网络连接将密码发送到您的应用程序时,您正试图“保护”您的密码,以防止窃听。这样做的方法是为应用程序启用 HTTPS(最好使用 TLSv1.1+),以便客户端和服务器之间的所有通信都使用临时会话密钥加密(在受保护的握手过程中客户端和服务器之间协商,通过服务器证书中包含的公钥)。然后,当您发送凭据时,它们只能由拥有相应私钥的服务器恢复。
TL;DR 在通过 cURL 发送之前不要篡改您的密码;改用 TLS。