OpenJFX вместо OpenJDK

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

Кроме того, awk – хороший инструмент, когда нужно выполнять "умные" операции с текстовым файлом, имеющим более читаемый язык, чем sed. «Умная» операция, которую необходимо выполнить в этом случае, состоит в том, чтобы избежать повторного -выполнения алгоритма запутывания, когда какой-либо один MAC-адрес встречается более одного раза. Это может значительно ускорить работу, если у вас есть тысячи строк, относящихся к небольшому количеству MAC-адресов.

На практике рассмотрим следующий сценарий, который также обрабатывает возможные множественные MAC-адреса, встречающиеся в любой строке, идентифицируя и заменяя каждое вхождение, а затем печатает таблицу сопоставления в конце:

awk -v pat='clientMac"\\s*"[[:xdigit:]]{12}' -v table='sort -k 1,1n | column -t' -- '
$0 ~ pat {
    for (i=1; i <= NF; i++)
        if (match($i, pat)) {
            if (!($i in cache))
                cache[$i]=NR "." i
            $i = "MAC:" cache[$i]
        }
}
1
END {
    print "---Table: "FILENAME"\nnum MAC" | table
    for (mac in cache)
        print cache[mac], mac | table
}
' file.log

Таблицу в конце можно легко отделить от основного вывода дополнительным шагом редактирования или просто заставив командную строку в аргументе -v table=перенаправить вывод в файл, как в -v table='sort -k 1,1n | column -t > table'. Его также можно полностью удалить, просто удалив весь блок END{ … }.

Как вариант, использование реального механизма шифрования для вычисления значений запутывания и, следовательно, отсутствие таблицы сопоставления в конце:

awk -v pat='clientMac"\\s*"[[:xdigit:]]{12}' -v crypter='openssl enc -aes-256-cbc -a -pass file:mypassfile' -- '
$0 ~ pat {
    for (i=1; i <= NF; i++)
        if (match($i, pat)) {
            addr = cache[$i]
            if (addr == "") {
                "echo '\''" $i "'\'' | " crypter | getline addr
                cache[$i] = addr
            }
            $i = "MAC:" addr
        }
}
1
' file.log

Здесь я использовал opensslв качестве механизма шифрования, выбрав его aes-256-cbcшифр (с выходом в кодировке base64 -, чтобы он был текстовым -дружественным ), и заставил его читать секрет шифрования. из файла с именем mypassfile.

Строки, зашифрованные с помощью симметричного шифра (типа aes-256-cbc), можно расшифровать, зная секрет, используемый (содержимое mypassfile, которое вы хотите сохранить для себя ), поэтому их можно обратить. Кроме того, поскольку opensslпо умолчанию использует случайную соль, каждый запуск выдает разные значения для одного и того же ввода. Неиспользование параметра соли (-nosalt)приведет к тому, что opensslвыдаст одно и то же значение для каждого запуска,поэтому менее безопасный, но, с другой стороны, будет создавать более короткие тексты, все еще будучи зашифрованными.

Тот же сценарий awkбудет работать для других внешних команд вместо openssl, просто заменив команду в аргументе -v crypter=на awk, если выбранная вами внешняя команда может принимать ввод со стандартного ввода и вывод на стандартный вывод.

Строки, хешированные с помощью таких алгоритмов, как MD5 или SHA, являются односторонними -только (, т. е. они не могут быть реверсированы )и всегда дают одно и то же значение для одних и тех же входных данных, поэтому вы захотите «посолить» их, чтобы вычисленные значения, полученные на выходе, нельзя было просто искать по всем возможным MAC-адресам. Вы можете добавить случайную «соль», как в следующем слегка измененном скрипте:

awk -v pat='clientMac"\\s*"[[:xdigit:]]{12}' -v crypter='sha256sum' -- '
$0 ~ pat {
    for (i=1; i <= NF; i++)
        if (match($i, pat)) {
            addr = cache[$i]
            if (addr == "") {
                "(dd if=/dev/random bs=16 count=1 2>/dev/null; echo '\''" $i "'\'') | " crypter | getline addr
                cache[$i] = addr
            }
            $i = "MAC:" addr
        }
}
1
' file.log

Этот последний сценарий использует 16-байтовое -длинное (псевдослучайное -)значение в качестве «соли», таким образом создавая разные хэш-значения при каждом прогоне одних и тех же данных.

0
04.09.2021, 12:21
0 ответов

Теги

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