Published on

December 4, 2023

Безопасное хранение данных кредитных карт в SQL Server

Когда речь идет о работе с данными кредитных карт, безопасность имеет первостепенное значение. Хранение информации о кредитных картах в открытом виде в базе данных может представлять значительный риск, так как она может быть легко доступна неавторизованным лицам. Для соблюдения регулирований и защиты конфиденциальных данных крайне важно хранить информацию о кредитных картах в зашифрованном и захешированном формате.

Одно из распространенных требований в приложениях – позволить клиентам повторно использовать свою кредитную карту без необходимости повторного ввода данных карты каждый раз. Это можно достичь, сохраняя зашифрованное значение кредитной карты в базе данных вместе с секретной фразой, которая используется для расшифровки номера карты при необходимости.

В SQL Server есть встроенные функции, которые можно использовать для шифрования и дешифрования данных. Функция ENCRYPTBYPASSPHRASE используется для шифрования данных с использованием фразы-пароля, а функция DECRYPTBYPASSPHRASE используется для дешифрования данных с использованием той же фразы-пароля.

Для реализации этого решения мы можем создать хранимую процедуру T-SQL для процесса шифрования и скалярную UDF (User-Defined Function) T-SQL для процесса дешифрования. Эти объекты будут использовать функции ENCRYPTBYPASSPHRASE и DECRYPTBYPASSPHRASE, предоставленные SQL Server.

Давайте рассмотрим пример реализации:

-- Хранимая процедура шифрования SQL Server
CREATE PROC dbo.usp_updateEncryptedCredNo (@p_cust VARCHAR(20), @p_real_cardno VARCHAR(20), @passphrase NVARCHAR(128))
AS
BEGIN
   SET NOCOUNT ON
   IF EXISTS (SELECT 1 FROM dbo.Customers WHERE CustID = @p_cust)
   BEGIN
      UPDATE dbo.Customers
      SET Encrypted_CredCard = ENCRYPTBYPASSPHRASE(@passphrase, @p_real_cardno)
   END
   ELSE
   BEGIN
      INSERT INTO dbo.Customers (CustID, Encrypted_CredCard)
      VALUES (@p_cust, ENCRYPTBYPASSPHRASE(@passphrase, @p_real_cardno))
   END
END

-- Функция дешифрования SQL Server
CREATE FUNCTION dbo.fnGetCredNumber (@p_cust VARCHAR(20), @passphrase NVARCHAR(128))
RETURNS VARCHAR(20)
AS
BEGIN
   DECLARE @credno VARCHAR(20)
   SELECT @credno = CONVERT(VARCHAR(20), DECRYPTBYPASSPHRASE(@passphrase, Encrypted_CredCard))
   FROM dbo.Customers
   WHERE CustID = @p_cust 

   RETURN @credno
END

В приведенном выше примере у нас есть таблица Customers с колонками CustID и Encrypted_CredCard. Хранимая процедура usp_updateEncryptedCredNo используется для обновления или вставки зашифрованного номера кредитной карты в таблицу Customers. Функция fnGetCredNumber используется для получения расшифрованного номера кредитной карты для заданного клиента.

Вот как мы можем использовать эти объекты:

-- Примеры выполнения
-- Шифрование номера кредитной карты для клиента "ABC"
EXEC dbo.usp_updateEncryptedCredNo 'ABC', '1234-567890', 'CRAZY LITTLE THING CALLED SQL!'

-- Дешифрование номера кредитной карты для клиента "ABC"
SELECT dbo.fnGetCredNumber('ABC', 'CRAZY LITTLE THING CALLED SQL!')

Следуя этому подходу, мы можем безопасно хранить данные кредитных карт в базе данных, позволяя клиентам повторно использовать свои карты без необходимости повторного ввода данных. Важно отметить, что секретная фраза, используемая для шифрования и дешифрования, не должна храниться в базе данных и должна быть надежно защищена.

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

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.