设想情况:
问题:
是任何熟悉加密/混淆一列数据的方法的人吗?,它完全是在Presto查询中进行解密/去混淆的。
我知道我可以轻松地对查询的结果进行后置处理,并自己加密/混淆它,但如果可能的话,我想利用Presto的分布式执行模型。
加密/混淆的级别不需要是不可穿透的--只是比base64编码复杂一些(最好有一个简单的秘密)。
发布于 2018-01-23 21:18:17
经过进一步的研究,我偶然发现了异或密码,它似乎完全可以在Presto查询中实现。
我已经用以下概念的证据对它进行了简短的测试:
WITH
private_data AS (
SELECT 'some private string' as private
),
encrypted_data AS (
SELECT
zip_with(
regexp_extract_all(private, '.'),
regexp_extract_all(substr('a27e6f329c03461688d6866203aasdljfasaslksa7982k3lkjsd987fok2jlkj0sdf9c59c', 1, length(private)), '.'),
(x, y) ->
bitwise_xor(codepoint(cast(x as varchar(1))), codepoint(cast(y as varchar(1))))
) as encrypted_data
FROM private_data
),
decrypted_data AS (
SELECT
array_join(
zip_with(
encrypted_data,
regexp_extract_all(substr('a27e6f329c03461688d6866203aasdljfasaslksa7982k3lkjsd987fok2jlkj0sdf9c59c', 1, cardinality(encrypted_data)), '.'),
(x, y) ->
chr(bitwise_xor(x, codepoint(cast(y as varchar(1)))))
),
''
) as decrypted_string
FROM encrypted_data
)
SELECT
*
FROM private_data, encrypted_data, decrypted_data虽然我想把它简化得更简单一些,但它似乎很有效。有人能找到优化它的方法吗?(例如:从长度为1的varchar到varchar(1)的转换似乎很荒谬,但如果我不这样做,它会抱怨。此外,regexp_extract_all也是将varchar转换为数组的唯一方法。)
发布于 2018-01-23 09:12:01
我认为您可以提供您自己的UDF (用户定义函数),它可以执行一些对称加密。这里有如何实现这样的函数的文档:https://prestosql.io/docs/current/develop/functions.html,这里有一些Presto的示例项目。
那么在普雷斯托你可以:
SELECT decrypt_your_udf_function(private_column_encrypted, 'your password')FROM table;
INSERT INTO table (private_column_encrypted) SELECT encrypt_your_udf_function(private_column, 'your password') FROM ...发布于 2019-04-27 07:59:56
我已经创建了一个示例项目,其中包含用于基本加密和解密的UDF,您可以找到它这里。以下是一些想法:
https://stackoverflow.com/questions/48394525
复制相似问题