Другие уже упомянули, что вся концепция, ну, сомнительна.
Вы должны спросить себя, какие атаки такого рода шифрование (я предпочитаю, чтобы слово «скремблирование» здесь отличалось от «реального» шифрования) могло помешать, какие атаки он не мог предотвратить, и как они соответствуют атакам вы действительно ожидаете и пытаетесь предотвратить.
Как правило, идея, как вы ее описываете, в лучшем случае - «безопасность через безвестность», поэтому она добавляет некоторые «чувства безопасности», но почти не «реальную безопасность».
Тем не менее, вот несколько простых решений.
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 расшифровывать. Вы не можете легко расшифровывать все данные таким образом и должны делать это с помощью одной записи - вы можете видеть ее как плохую (неудобную) или хорошую (противнику нужно будет немного подумать, чтобы получить сразу все незашифрованные данные).
Есть также other techniques для преобразования двоичных строк в строку, если вам не нравятся эти.
2. хранить строку как число (операция XOR со случайной солью)
'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 and other crpytographic functions и How to: Encrypt a Column of Data. Здесь используется какое-то реальное шифрование, а управление ключами поддерживается MSSQL, поэтому это может стать основой для создания «реальной» безопасности (конечно, есть еще много способов ее испортить :-)).
Зачем шифровать вещи, если вы хотите, чтобы люди могли легко сломать шифрование? – tdammers
Мы хотим затмить данные, чтобы случайные пользователи не сразу узнали, что такое номер клиента. Вот и все, да, я знаю, что это может быть нарушено, и это не проблема. – MrTelly