【问题标题】:Encrypt in SQL Server and decrypt in Python / spark在 SQL Server 中加密并在 Python / spark 中解密
【发布时间】:2021-10-05 05:16:44
【问题描述】:

是否可以在 SQL Server 中加密一列,然后在 Python code 中对其进行解密?

我需要这个,因为我正在处理许多不同的数据源并构建数据提取管道,但是有一些敏感信息应该在某些步骤上加密,例如数据库,但我稍后需要它们作为纯文本处理它,所以想法是通过SP或内置函数在数据库上对其进行加密,然后能够使用python / spark对其进行解密。

如果有人有其他想法,请随时分享。

【问题讨论】:

    标签: python sql-server stored-procedures encryption


    【解决方案1】:

    每个软件都有自己的加密方法,从技术上讲,如果您在其中加密数据,则在不涉及 SQL Server DB 引擎的情况下应该不可能解密。否则,任何人都可以解密敏感数据,从而使加密无用。

    但据我所知,您可以从 python 调用内部 SQL 函数。

    好吧,让我自己试试看——>

    现在这可能不是使用加密/解密的最佳方式,但使用 sql 中的密码短语加密功能作为演示可能会有所帮助。

    CREATE DATABASE TEST_ENCRYPT /* CREATE DATABASE */
    GO
    
    USE TEST_ENCRYPT /* USE DATABASE */
    GO
    
    CREATE TABLE EMPLOYEES (ID INT IDENTITY, NAME VARCHAR(20), SALARY VARBINARY(256)) /* CREATE TABLE */
    GO
    
    CREATE OR ALTER PROCEDURE INSERT_DATA    /* CREATE STORED PROCEDURE THAT WILL INSERT DATA INTO TABLE */
    @EMPLOYEE_NAME VARCHAR(20), @SALARY INT
    AS
    BEGIN
    DECLARE @KEY VARCHAR(20) = 'testkey'   /* PASSPHRASE IS CASE SENSITVE*/
    INSERT INTO EMPLOYEES
            VALUES 
                    (
                    @EMPLOYEE_NAME,
                    ENCRYPTBYPASSPHRASE(@KEY  
                        , CAST (@SALARY AS VARBINARY(256)))
                    
                    )
    
    END
    
    EXEC INSERT_DATA @EMPLOYEE_NAME = 'TIM', @SALARY = 34000 /* INSERT DATA */
    

    我的表在我的 DBA 眼中如何?

    现在要检查数据,您的查询应该是这样的

    DECLARE @KEY VARCHAR(20) = 'testkey'
    SELECT NAME, CAST (DECRYPTBYPASSPHRASE (@KEY, SALARY) AS INT) [SALARY] FROM EMPLOYEES /* CHECK DATA BY INTERNALLY DECRYPTING IN SQL SERVER */
    

    但是,您可以从 python 中运行,而不是从 sql server 中运行该查询

    import pyodbc 
    conn = pyodbc.connect('Driver={SQL Server};'
                          'Server=Blackbox;'
                          'Database=test_encrypt;'
                          'Trusted_Connection=yes;')
    var1 = ('testkey',)
    cursor = conn.cursor()
    cursor.execute('SELECT name, cast (DECRYPTBYPASSPHRASE (?, salary) as int) [Salary] FROM test_encrypt.dbo.Employees', var1)
    
    for row in cursor:
        print(row)
    

    这些只是众多方法中的一种。您可以使用证书、密钥、非对称密钥等

    阅读文档https://docs.microsoft.com/en-us/sql/t-sql/functions/cryptographic-functions-transact-sql?view=sql-server-ver15

    【讨论】:

      猜你喜欢
      • 2011-04-29
      • 2011-09-23
      • 2015-08-26
      • 1970-01-01
      • 2011-01-10
      • 2011-01-10
      • 2020-09-12
      • 2011-07-12
      • 2021-11-13
      相关资源
      最近更新 更多