Эхо с обфускацией

В ssh нет специального механизма для уведомления о том, что вы используете какой-то ключ. Это работает или не работает.

Различать ключи с помощью парольной фразы

Единственная идея, которая приходит мне в голову - различать ключи с помощью парольной фразы.

Например, иметь ключи RSA в ssh-agent или без парольной фразы, а DSA - с парольной фразой (и не в ssh-agent). Это может предупредить вас с запросом парольной фразы.

Не использовать их

Самое простое - не добавить приведенную выше строку в ssh_config, и тогда вы увидите, когда не можете подключиться. Затем вы можете использовать опции в командной строке для отдельных соединений:

ssh -oPubkeyAcceptedKeyTypes=+ssh-dss host
15
20.03.2019, 16:16
5 ответов

Другие ответы маскируют фиксированное количество символов с самого начала, а суффикс открытого текста различается по длине. Альтернативой было бы оставить фиксированное количество символов в открытом тексте и изменить длину замаскированной части. Я не знаю, какой из них более полезен, но вот другой выбор:

#!/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-> ***deиabc->***):

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"
}
13
27.01.2020, 19:49

Один из вариантов — заставить себя использовать функцию вместо echo, например:

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

Затем вы можете вызвать obfuprint 'secretvalue'и получить********lue(с завершающим символом новой строки ). Функция использует расширение параметра для поиска первых восьми символов переданного значения -и заменяет их восемью звездочками. Если входящее значение короче восьми символов, все они заменяются звездочками. Спасибо ilkkachu за указание на мое первоначальное предположение о вводе восьми -или -дополнительных символов!


Вдохновленный ответом 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*
14
27.01.2020, 19:49

Вы можете попробовать подключиться к sed. Например, чтобы заменить первые 8 символов строки звездочками, вы можете передать команду sed 's/^......../********/', например.:

$ echo 'secretvalue' | sed 's/^......../********/'
********lue

Вы также можете определить функцию, которая делает это:

obsecho () { echo "$1" | sed 's/^......../*********/'; }
8
27.01.2020, 19:49

Вариант 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}
8
27.01.2020, 19:49

Другой вариант в 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}
2
27.01.2020, 19:49

Теги

Похожие вопросы