Как зашифровать или хэш-значения в SQL-сервере? - PullRequest
0 голосов
/ 10 января 2019

Я нахожусь в процессе создания демонстрационных данных из данных, которые содержат информацию об истории болезни пациента (PHI). Есть несколько столбцов, в которых я просто хочу сгенерировать случайное значение, которое остается постоянным во всех данных. Например, есть поле типа SSN, в котором я хочу создать случайную цифру из 9 цифр для каждого уникального номера SSN, но оставить это число таким же, когда заявки принадлежат одному и тому же человеку. Таким образом, 1 SSN может иметь 5 заявок, и каждая заявка будет иметь один и тот же случайно созданный SSN.

образец

ssn           date1       procedure
443234432     1/1/2019    needle poke
443234432     1/2/2019    needle poke
676343522     1/3/2019    total knee procedure
443234432     1/4/2019    total hip procedure
676343522     1/5/2019    needle poke

финал

ssn           date1       procedure
856345544     1/1/2019    needle poke
856345544     1/2/2019    needle poke
979583338     1/3/2019    total knee procedure
856345544     1/4/2019    total hip procedure
979583338     1/5/2019    needle poke

Как вы можете видеть, snn изменился, но остался прежним для всех случаев, когда ssn был одинаковым.

Для чисел, подобных этому, я могу преобразовать в числовое значение и умножить / разделить / сложить / вычесть, чтобы создать случайное число, сохраняющее целостность, но как я могу справиться с этим для случаев, когда есть нечисловые значения?

Я пытался использовать ХЭШБИТЫ, но получаю много странных персонажей. Есть ли другой метод, который мог бы генерировать случайное значение и поддерживать согласованность всего набора данных?

RIGHT(convert(NVARCHAR(10), HASHBYTES('MD5', SSN)),10) as SSN

RESULTS:
댛량뇟㻣砖聋蠤

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

Ответы [ 3 ]

0 голосов
/ 10 января 2019

Я, если я понимаю ваш запрос, чтобы преобразовать varbinary в varchar, посмотрите на эту статью: varbinary to string на SQL Server

И вы можете попробовать этот код:

SELECT RIGHT(CONVERT(VARCHAR(1000), HASHBYTES('MD5', 'SOMEVALUE'), 1),10);
0 голосов
/ 10 января 2019

Я думаю, вы хотите печатные символы. В этом случае вы можете использовать функцию CONVERT для преобразования байтового результата HASHBYTES в шестнадцатеричное представление в виде строки. Просто убедитесь, что в качестве третьего параметра передано значение 2.

DECLARE @SomeValue VARCHAR(100) = CONVERT(VARCHAR(100), NEWID())

SELECT
    @SomeValue AS Original,
    CONVERT(
        VARCHAR(20), 
        HASHBYTES('MD5', @SomeValue), 
        2) AS Scrambled

Несколько результатов:

Original                                Scrambled
BC9EC2E0-2009-45FA-AA95-64585B815BD9    A33AEBC011E9188EB97E
6FF7E0FE-E054-49D7-A451-80111BF5B200    94F93C6A5CBD0E56C70B
C8F8CD77-96B7-4B74-84B7-4EB3412C6CE7    2994341068CE8C4E1EF9

В качестве первого параметра укажите длину, которую вы хотите в качестве цели varchar.

Обратите внимание, что хеш-функции могут генерировать один и тот же результат на разных входах, и это будет особенно важно, если вы усекаете результат до первых N символов.

0 голосов
/ 10 января 2019

Я не понимаю вашу проблему:

SELECT HASHBYTES('MD5', N'Wahoooo') 

Это прекрасно работает и будет всегда иметь одно и то же значение. Возможно, проблема с искаженными символами связана с тем, что вы пытаетесь преобразовать значение varbinary в nvarchar.

SELECT CAST(HASHBYTES('MD5', N'Wahoooo') AS nvarchar(10))
...