回声与混淆

回声与混淆

我需要在屏幕上打印一些变量,但我需要最好混淆前几个字符,我想知道 bash 中是否有一个 echo 命令可以在将秘密值打印到终端时混淆它的第一个字符:

echo 'secretvalue'
********lue

答案1

一种选择是强迫自己使用函数而不是echo,例如:

obfuprint() {
  if [ "${#1}" -ge 8 ]
  then
    printf '%s\n' "${1/????????/********}"
  else
    printf '%s\n' "${1//?/*}"
  fi
}

然后您可以调用obfuprint 'secretvalue'并接收********lue(带有尾随换行符)。该函数使用参数扩展来搜索传入值的前八个字符,并将其替换为八个星号。如果传入值短于八个字符,则全部替换为星号。谢谢伊尔卡丘感谢指出我最初假设的八个或更多字符输入!


灵感来自ilkkachu 的灵活屏蔽答案,我认为添加一个随机掩盖字符串一定百分比的变体会很有趣:

obfuprintperc () {
  local perc=75  ## percent to obfuscate
  local i=0
  for((i=0; i < ${#1}; i++))
  do
    if [ $(( $RANDOM % 100 )) -lt "$perc" ]
    then
        printf '%s' '*'
    else
        printf '%s' "${1:i:1}"
    fi
  done
  echo
}

这依赖于 bash 的$RANDOM特殊变量;它只是循环遍历输入的每个字符并决定是屏蔽该字符还是打印它。示例输出:

$ obfuprintperc 0123456789
0*****6*8*
$ obfuprintperc 0123456789
012***678*
$ obfuprintperc 0123456789
**********
$ obfuprintperc 0123456789
*****56***
$ obfuprintperc 0123456789
0*******8*

答案2

其他答案从一开始就掩盖固定数量的字符,明文后缀的长度各不相同。另一种方法是在明文中保留固定数量的字符,并改变屏蔽部分的长度。我不知道哪个更有用,但这是另一种选择:

#!/bin/bash
mask() {
        local n=3                    # number of chars to leave
        local a="${1:0:${#1}-n}"     # take all but the last n chars
        local b="${1:${#1}-n}"       # take the final n chars 
        printf "%s%s\n" "${a//?/*}" "$b"   # substitute a with asterisks
}

mask abcde
mask abcdefghijkl

这将打印**cde*********jkl


如果您愿意,您还可以修改n短字符串,以确保大部分字符串被屏蔽。例如,这将确保至少三个字符被屏蔽,即使对于短字符串也是如此。 (所以abcde->***deabc-> ***):

mask() {
        local n=3
        [[ ${#1} -le 5 ]] && n=$(( ${#1} - 3 ))
        local a="${1:0:${#1}-n}"
        local b="${1:${#1}-n}"
        printf "%s%s\n" "${a//?/*}" "$b"
}

答案3

zsh掩盖了四分之三文本的变体:

mask() printf '%s\n' ${(l[$#1][*])1:$#1*3/4}

例子:

$ mask secretvalue
********lue
$ mask 12345678
******78
$ mask 1234
***4

要屏蔽前 8 个字符:

mask() printf '%s\n' ${(l[$#1][*])1:8}

要屏蔽除最后 3 个字符之外的所有字符:

mask() printf '%s\n' ${(l[$#1][*])1: -3}

屏蔽随机数量的字符:

mask() printf '%s\n' ${(l[$#1][*])1: RANDOM%$#1}

答案4

Bash 中的另一个选项,如果你不介意一个简单的,eval你可以用几个来完成printf

# example data
password=secretvalue
chars_to_show=3

# the real thing
eval "printf '*%.0s' {1..$((${#password} - chars_to_show))}"
printf '%s\n' "${password: -chars_to_show}"

不过要小心:

  • ${#password}当小于时根据需要修复上述内容${chars_to_show}
  • eval对于不受信任的输入可能非常危险:这里可以认为是安全的,因为它的输入仅来自安全来源,即 的长度${password}和值${chars_to_show}

相关内容