Другие уже упоминали, что вся концепция, ну, сомнительна.
Вы должны спросить себя, какой тип атак может предотвратить этот тип шифрования (я предпочитаю слово «шифрование» здесь, чтобы отличать его от «реального» шифрования), какие типы атак он не может предотвратить и как они соответствуют атакам, которые вы на самом деле делаете ожидаем и пытаемся помешать.
Как правило, идея, которую вы описываете, это в лучшем случае «безопасность через неизвестность», поэтому она добавляет некоторое «чувство безопасности», но почти не «реальной безопасности».
Тем не менее, вот несколько простых решений.
1.
Сохранить строку как ее шестнадцатеричное представление
«ABC1234» становится «0x41424331323334».
DECLARE @x varchar(30)
-- scrambling: convert string to its hex representation
SET @x = sys.fn_varbintohexstr(CAST('ABC1234' AS varbinary))
SELECT @x -- returns '0x41424331323334'
-- unscrambling
EXEC('SELECT CAST(' + @x + ' AS varchar(30))')
Здесь я использовал недокументированную функцию fn_varbintohexstr для шифрования и EXEC для расшифровки. Вы не можете легко расшифровать все данные таким образом, и вам придется делать это одной записью - вы можете видеть, что это плохо (неудобно) или хорошо (противник должен будет немного подумать, чтобы получить все расшифрованные данные одновременно).
Есть также другие методы для преобразования двоичных данных в строки, если вам не нравятся эти.
2.
Сохранить строку как число (XORed со случайной солью)
«ABC1234» становится -5389962212370045368.
Обратите внимание, что это не будет работать для строк длиннее 8 символов, поскольку встроенный в MSSQL XOR работает только с целыми числами (и самый большой из них имеет длину 8 байт). Конечно, можно создать UDF для выполнения XOR с произвольным длинным двоичным типом, но здесь я постарался упростить задачу.
-- use a random salt (a kind of 'shared secret')
DECLARE @salt bigint
SET @salt = 0xf47142dde0d49248
DECLARE @x bigint
-- scramble: cast to bigint and XOR with the seed
SET @x = CAST(CAST('ABC1234' AS binary(8)) AS BIGINT) ^ @salt
SELECT @x -- returns -5389962212370045368
-- unscramble
SELECT CAST(CAST(@x ^ @salt as varbinary) as varchar)
Здесь случайная соль используется как для скремблирования, так и для скремблирования. Вы могли бы попытаться создать дополнительную защиту, скажем, хранить значение соли в вашем приложении и передавать его в базу данных при каждом вызове, так что одного доступа к базе данных недостаточно, чтобы легко получить данные (конечно, это все еще довольно легко сломать - например, с известной атакой открытым текстом).
3. Используйте встроенное симметричное шифрование
«ABC1234» становится 0x01000000AECBC6E2A5B51F09B6953DFD7A648675E4DD3CE46E93BC0D.
Это опирается на встроенные функции симметричного шифрования MSSQL2005 + (я полагаю, что для внутренних целей он использует AES256 или 3DES в зависимости от платформы).
-- use random passphrase
DECLARE @pwd varchar(30)
SET @pwd = 0xA0880D9980AE0C4EA28A8A247763AB5B
SELECT @pwd
-- encrypt with the passphrase
DECLARE @x varbinary(8000)
SET @x = EncryptByPassPhrase(@pwd, 'ABC1234')
SELECT @x -- 0x01000000AECBC6E2A5B51F09B6953DFD7A648675E4DD3CE46E93BC0D
-- decrypt
SELECT CAST(DecryptByPassPhrase(@pwd, @x) AS varchar)
См. Также EncryptByKey и другие функции crpytographic и Как: зашифровать столбец данных . Здесь используется реальное шифрование, а управление ключами изначально поддерживается MSSQL, поэтому это может послужить основой для создания некоторой «реальной» безопасности (конечно, есть еще много способов ее обойти :-)).