У меня есть файл CSV (значения, разделенные запятыми)
Файл выглядит так:
20171108,120909470,SO1244,12,101
20171109,122715740,AG415757,11,101
Мне нужно скрыть данные в (например) столбцах 3 и, не затрагивая другие записи в файле.
Я хочу сделать это, используя алгоритм хеширования, такой как SHA1 или MD5, чтобы одни и те же строки возвращались к одинаковым значениям хеш-функции везде, где они встречаются.
Мне нужно отправить данные третьему лицу, и некоторые столбцы содержат конфиденциальную информацию (например, имена клиентов). Мне нужно, чтобы файл был завершен, и, когда строка заменяется, мне нужно, чтобы она выполнялась одинаково при каждом обнаружении (чтобы не возникало сопоставления или группировки). Для этого не нужно военное шифрование, просто чтобы его было трудно перевернуть. Поскольку мне нужно к этому периодически, решение на основе сценария было бы идеальным.
Какой самый простой способ добиться этого с помощью инструмента командной строки или сценария?
По желанию я бы хотел сценарий PowerShell, поскольку для этого не требуется никакого дополнительного программного обеспечения ...
Этот вопрос выглядит как дубликат Мне нужно хэшировать (обфусцировать) столбец данных в файле CSV. Сценарий предпочел , но предложенное решение не решило мою проблему и выдает следующую ошибку
You cannot call a method on a null-valued expression.
At C:\Users\mey\Hashr.ps1:4 char:5
+ $_.column3 = $_.column3.gethashcode()
Сценарий следующий
(Import-Csv .\results.csv -delimiter ',' ) | ForEach-Object{
$_.column3 = $_.column3.gethashcode()
$_
} | Export-Csv .\myobfuscated.csv -NoTypeInformation -delimiter ','
Обновление:
Вот программа, которую я запускаю и которая была предложена @BaconBits:
param (
[Parameter(Mandatory = $true, ValueFromPipeline = $true, Position = 0)]
[String[]]
$String,
[Parameter(Position = 1)]
[ValidateSet('SHA1', 'MD5', 'SHA256', 'SHA384', 'SHA512')]
[String]
$HashName = 'SHA256'
)
process {
$StringBuilder = [System.Text.StringBuilder]::new(128)
[System.Security.Cryptography.HashAlgorithm]::Create($HashName).ComputeHash([System.Text.Encoding]::UTF8.GetBytes($String)) | ForEach-Object {
[Void]$StringBuilder.Append($_.ToString("x2"))
}
$StringBuilder.ToString()
}
}
$csv = Import-Csv .\results.csv -delimiter ','
foreach ($line in $csv) {
$line.column1 = Get-StringHash $line.column1
}
$csv | Export-Csv .\myobfuscated.csv -NoTypeInformation -delimiter ','
CSV-файл, который я импортирую, является выводом из другой Java-программы, которую я создал, и он не создает заголовка, он просто заполняет CSV-файл значениями
Я получаю эту ошибку
Get-StringHash: невозможно связать аргумент с параметром 'String', поскольку он имеет значение null.