Как создать хеш sha256 с солью - PullRequest
2 голосов
/ 15 октября 2019

Я бы хотел перенести генерацию хэша в BigQuery, который имеет SHA256, но не имеет соли в качестве параметра.

Например, в R я могу сделать что-то вроде этого:

library(openssl)
sha256("test@gmail.com", key = "111")
# [1] "172f052058445afd9fe3afce05bfec573b5bb4c659bfd4cfc69a59d1597a0031"

Обновление

то же самое с Python на основе ответа здесь :

import hmac
import hashlib
print(hmac.new(b"111", b"test@gmail.com", hashlib.sha256).hexdigest())
# 172f052058445afd9fe3afce05bfec573b5bb4c659bfd4cfc69a59d1597a0031

Ответы [ 2 ]

2 голосов
/ 15 октября 2019

Надеюсь, под «миграцией» вы подразумеваете миграцию логики, а не точного побайтного вывода из функции R Sha256 ().

R использует hmacsha256 и смотрит на класс Microsoft HMACSHA256 , это можно приблизительно выразить как:

Процесс HMAC смешивает секретный ключ с данными сообщения, хэширует результат с помощью хэш-функции, снова смешивает это хеш-значение с секретным ключом изатем применяет хэш-функцию во второй раз. Выходной хэш имеет длину 256 бит.

create temp function hmacsha256(content STRING, key STRING)
AS (SHA256(
     CONCAT(
       TO_HEX(SHA256(CONCAT(content, key))), key)
       ));

SELECT TO_HEX(hmacsha256("test@gmail.com", "111"));

Выход:

+------------------------------------------------------------------+
|                               f0_                                |
+------------------------------------------------------------------+
| 4010f74e5c69ddbe1e36975f7cb8be64bcfd1203dbc8e009b29d7a12a8bf5fef |
+------------------------------------------------------------------+
1 голос
/ 16 октября 2019

С помощью @Yun мне удалось решить эту проблему.

Чтобы применить HMAC, вам потребуется включить внешнюю библиотеку file в пример функции ниже.

CREATE TEMP FUNCTION USER_HASH(message STRING, secret STRING)
  RETURNS STRING
  LANGUAGE js
  OPTIONS (
    -- copy this Forge library file to Storage:
    -- https://cdn.jsdelivr.net/npm/node-forge@0.7.0/dist/forge.min.js
    -- @see https://github.com/digitalbazaar/forge
    library=["gs://.../forge.min.js"]
  )
  AS
"""
  var hmac = forge.hmac.create();
  hmac.start('sha256', secret);
  hmac.update(message);
  return hmac.digest().toHex();
""";


SELECT USER_HASH("test@gmail.com", "111");

-- Row  f0_
-- 1    172f052058445afd9fe3afce05bfec573b5bb4c659bfd4cfc69a59d1597a0031
...