Necesito imprimir algunas variables en la pantalla, pero necesito ofuscar preferentemente los primeros caracteres y me preguntaba si había un comando echo en bash que pudiera ofuscar los primeros caracteres de un valor secreto al imprimirlo en el terminal:
Las otras respuestas enmascaran una cantidad fija de caracteres desde el principio, con el sufijo de texto plano que varía en longitud. Una alternativa sería dejar una cantidad fija de caracteres en texto sin formato y variar la longitud de la parte enmascarada. No sé cuál es más útil, pero aquí está la otra opción:
#!/bin/bash
mask(){local n=3# number of chars to leavelocal a="${1:0:${#1}-n}"# take all but the last n charslocal b="${1:${#1}-n}"# take the final n chars
printf "%s%s\n""${a//?/*}""$b"# substitute a with asterisks}
mask abcde
mask abcdefghijkl
Esto imprime **cdey *********jkl.
Si lo desea, también puede modificar ncadenas cortas para asegurarse de que se enmascara la mayoría de las cadenas. Por ejemplo, esto aseguraría que al menos tres caracteres estén enmascarados incluso para cadenas cortas. (entonces abcde-> ***de, y abc-> ***):
Entonces podría llamar obfuprint 'secretvalue'y recibir ********lue(con una nueva línea final). La función utiliza la expansión de parámetros para buscar los primeros ocho caracteres del valor pasado y los reemplaza con ocho asteriscos. Si el valor entrante es más corto que ocho caracteres, todos se reemplazan con asteriscos. ¡Gracias a ilkkachu por señalar mi suposición inicial de ocho o más entradas de caracteres!
Esto se basa en la $RANDOMvariable especial de bash ; simplemente recorre cada carácter de la entrada y decide si enmascarar ese carácter o imprimirlo. Salida de muestra:
Para ser sincero, no me gusta el enmascaramiento aleatorio. Un surfista de hombros determinado eventualmente obtendrá mis secretos fingiendo que le gusta conversar conmigo.
emory
¡Ciertamente, la visualización de información confidencial debe hacerse con cuidado! Presente el enmascaramiento aleatorio como una alternativa al enmascaramiento de prefijo fijo y al enmascaramiento de prefijo variable.
Jeff Schaller
44
Tampoco soy un fanático del enmascaramiento de prefijo fijo o prefijo variable, pero con ellos existe un "núcleo" de mi secreto que sigue siendo secreto. Con el enmascaramiento aleatorio, no hay "núcleo". Finalmente, todo se revelará a los pacientes lo suficiente.
emory
7
Podrías intentarlo sed. Por ejemplo, para reemplazar los primeros 8 caracteres de una cadena con asteriscos, puede canalizar el sed 's/^......../********/'comando, por ejemplo:
$ echo 'secretvalue'| sed 's/^......../********/'********lue
También puede definir una función que haga esto:
obsecho (){ echo "$1"| sed 's/^......../*********/';}
Otra opción en Bash, si no te importa una simple eval, puedes hacerlo con un par de printf:
# example data
password=secretvalue
chars_to_show=3# the real thingeval"printf '*%.0s' {1..$((${#password} - chars_to_show))}"
printf '%s\n'"${password: -chars_to_show}"
Pero ten cuidado:
arregle lo anterior como necesite cuando ${#password}sea menor que${chars_to_show}
evalpuede ser muy peligroso con entradas no confiables: aquí puede considerarse seguro porque su entrada proviene solo de fuentes seguras, es decir, la longitud ${password}y el valor de${chars_to_show}
Podrías intentarlo
sed
. Por ejemplo, para reemplazar los primeros 8 caracteres de una cadena con asteriscos, puede canalizar elsed 's/^......../********/'
comando, por ejemplo:También puede definir una función que haga esto:
fuente
printf
sobreecho
lo que no está sujeto a la interpretación de los datos, tales como\r
o\n
sed 's/^......../********/' <<< 'secretvalue'
bash -c 'lsof -d0 -a -p $$ 2>/dev/null' <<< foo
.Una
zsh
variante que enmascara tres cuartos del texto:Ejemplo:
Para enmascarar los primeros 8 caracteres:
Para enmascarar todos menos los últimos 3 caracteres:
Para enmascarar un número aleatorio de caracteres:
fuente
Otra opción en Bash, si no te importa una simple
eval
, puedes hacerlo con un par deprintf
:Pero ten cuidado:
${#password}
sea menor que${chars_to_show}
eval
puede ser muy peligroso con entradas no confiables: aquí puede considerarse seguro porque su entrada proviene solo de fuentes seguras, es decir, la longitud${password}
y el valor de${chars_to_show}
fuente
Aquí hay algunos scripts de Toy Bash para jugar que muestran cómo combinar la búsqueda de expresiones regulares con la sustitución de cadenas.
strip_str.sh
privatize_str.sh
restricted_str.sh
Para llevar clave
[a-z 0-9]
es totalmente válido y útil, como un<search>
dentro${_var_name//<search>/<replace>}
de Bash^
, dentro de este contexto, es al revés onot
para búsquedas tipo regexobfuscate_str.sh
fuente