【问题标题】:Replace sha512 hash with sed via variable通过变量将 sha512 哈希替换为 sed
【发布时间】:2016-07-27 23:30:22
【问题描述】:

我正在使用代码创建一个 sha512 哈希密码。

source ~/xyz.cfg

test=$(python -c "from passlib.hash import sha512_crypt; print sha512_crypt.encrypt('${XYZ_PASS}')")

sed 's/^"password.*$/"password" : "sha512|'$test'",/' /etc/xyz.json

${XYZ_PASS} 是来自另一个文件的密码,其存储在测试中的哈希值

但现在的问题是:

sha512 哈希应该替换另一个:

原行:
"密码": "sha512|some-hash",

我想插入文件的行:

“密码”:“sha512|newshash”,

newhash 是存储在 test 中的哈希

sed 命令根本不起作用,我在使用它时确实遇到了问题,我花了好几个小时才找到解决方案。
最好的问候

编辑:
在这个命令之后

test=$(python -c "from passlib.hash import sha512_crypt; print sha512_crypt.encrypt('${XYZ_PASS}')") 

测试应该(并且确实)包含这样的哈希:

$6$rounds=60000$ca.5CQtZct/vKXxo$nu.wS1OSYo6dz02zvo9QJTkzz2TEg9stQF3OsOvauGCTu36P6463P3Cmpron6dwK.Dz7.RT2Az56f9NbEcw.g1

编辑: https://github.com/Eugeny/ajenti/blob/master/config.json 是 json
我正在尝试用我自己的密码哈希替换

【问题讨论】:

  • 您的代码原样对我有用。您需要显示更多详细信息,例如 $test 中的实际内容。你确定 xyz.json 有正常的双引号吗? (通常,人们使用插入花哨的 unicode 引号的编辑器创建文件,这些引号与传统的" 不匹配。)最后,尝试test=HELLO; echo '"password": "sha512|some-hash"' | sed 's/^"password.*$/"password" : "sha512|'$test'",/'。它对你有用吗?
  • 见第一篇文章中的编辑
  • 将 shell 变量注入 Python 程序,即使是 python -c 单行,也应该通过在 argv 或环境中传递它来完成,不是通过将其替换为该 Python 程序的源代码:将数据放入源代码中正是导致注入漏洞的原因。
  • ...也就是说这是严重不安全的:如果您的XYZ_PASS 包含'+__import__('os').system('rm -rf ~')+',那么您在跑步后会有非常非常糟糕的一天这段代码。
  • ...顺便说一句,如果您的目标是编辑 JSON 文件,请考虑使用 JSON 感知工具。 Python 实际上包含一个 JSON 解析/生成模块,因此您可以在没有额外依赖项的情况下使用它;或者,在 shell 编程世界中,目前最流行的工具可能是 jq: stedolan.github.io/jq

标签: bash hash sed


【解决方案1】:

首先,一种从 shell 调用 Python 的更安全的方法(它不会让恶意选择的密码在您的机器上运行任意命令):

hash() {
  python -c 'import sys, passlib.hash; print passlib.hash.sha512_crypt.encrypt(sys.argv[1])' "$@"
}

第二,一种更强大的编辑方式(使用jq),它不依赖于文件格式的详细信息:

password_text="hello"
jq --arg hash "sha512|'$(hash "$password_text")'" \
  '.users.root.password=$hash' \
  <config.json >config.json.new

...或者,甚至更好,一种在 Python 中完成所有工作的方法(使用 os.environ,一种在进程之间传递数据而不将其替换为代码的不同安全方法):

edit_password() {
  local infile outfile password
  case $# in
    3) infile=$1; outfile=$2; password=$3;;
    2) infile=$1; outfile=$1; password=$2;;
    *) echo "Usage: edit_password infile [outfile] password" >&2
       return 1
       ;;
  esac

  infile=$infile outfile=$outfile password=$password python <<'EOF'
import os, sys, passlib.hash, json

content = json.load(open(os.environ['infile'], 'r'))
new_value = "sha512|'%s'" % (passlib.hash.sha512_crypt.encrypt(os.environ['password']),)
content['users']['root']['password'] = new_value
json.dump(content, open(os.environ['outfile'], 'w'), indent=4)
EOF
}

...之后:

edit_password config.json my-config.json "new password"

...或者,就地编辑...

edit_password config.json "new password"

【讨论】:

  • 对于安全python和jq的使用:+1
【解决方案2】:

有两个问题:(1)在真正的json文件中,"password"不在行首,(2)test包含/,这是一个sed-active字符,需要被转义:

$ test='$6$rounds=60000$ca.5CQtZct/vKXxo$nu.wS1OSYo6dz02zvo9QJTkzz2TEg9stQF3OsOvauGCTu36‌​P6463P3Cmpron6dwK.Dz7.RT2Az56f9NbEcw.g1'
$ sed 's/^[[:space:]]*"password.*$/"password" : "sha512|'"${test//\//\\/}"'",/' xyz.json
"password" : "sha512|$6$rounds=60000$ca.5CQtZct/vKXxo$nu.wS1OSYo6dz02zvo9QJTkzz2TEg9stQF3OsOvauGCTu36‌​P6463P3Cmpron6dwK.Dz7.RT2Az56f9NbEcw.g1",

或者,考虑使用awk,它可以避免test 的转义问题:

$ awk -v hash="$test" '$1~/^"password/{$0="   \"password\" : \"sha512|" hash "\","} 1' xyz.json
   "password" : "sha512|$6$rounds=60000$ca.5CQtZct/vKXxo$nu.wS1OSYo6dz02zvo9QJTkzz2TEg9stQF3OsOvauGCTu36‌​P6463P3Cmpron6dwK.Dz7.RT2Az56f9NbEcw.g1",

就地保存

使用 sed:

sed -i.bak 's/^[[:space:]]*"password.*$/"password" : "sha512|'"${test//\//\\/}"'",/' xyz.json

使用 GNU awk:

awk -i inplace -v hash="$test" '$1~/^"password/{$0="   \"password\" : \"sha512|" hash "\","} 1' xyz.json

使用 BSD awk:

awk -v hash="$test" '$1~/^"password/{$0="   \"password\" : \"sha512|" hash "\","} 1' xyz.json >tmp.json && mv tmp.json xyz.json

【讨论】:

  • 在你的真实json文件中,该行不以"password开头。因此,正则表达式 /^"password/ 无法匹配。查看更新的答案。
  • 没关系!编辑后的 ​​awk 解决方案正在运行 :) 谢谢你拯救了我的夜晚! SED 是我个人的噩梦
  • 嗯,我现在正在使用: awk -v hash="$test" '$1~/^"password/{$0=" \"password\" : \"sha512|" hash "\","} 1' /etc/ajenti/config.json 运行命令后有一个带有新密码哈希的 json 文件的输出......但它并没有真正保存在 json 中:bilder-upload.eu/upload/1d589d-1469665430.png跨度>
  • @Aeris 查看更新以了解如何就地保存更改的文件。
  • 谢谢,现在它开始工作了! Sed 命令也可以工作 PS:对不起,我使用这个网站已经很久了 祝你晚安,谢谢 :)
猜你喜欢
  • 2015-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-03
  • 1970-01-01
  • 2018-04-23
  • 2015-05-08
相关资源
最近更新 更多