Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как записать шифрованную строку в базу правильно?  [new]
Kuanar
Member

Откуда:
Сообщений: 41
Здравствуйте! Помогите разобраться со следующей ситуацией:

Есть приложение который шифрует и дешифрует строку на Java. Теперь когда записываю этот шифрованную строку в базу он записывается искаженно.
Правильная строка выглядит так: +^ÖΖò‰M"€)¢ú(Ú$€â;ø··3$U§
А записывается в базу так: +^OI?o?M"?)?u(U$?a;o··?3$U§

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

СУБД - SQL Server 2008 R2
Тип поля - nvarchar(50)
14 дек 12, 08:37    [13629814]     Ответить | Цитировать Сообщить модератору
 Re: Как записать шифрованную строку в базу правильно?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31439
Kuanar,

Это скорее нужно спросить на форуме по Java - очевидно, в сиквел неправильно строка передаётся.
14 дек 12, 08:57    [13629876]     Ответить | Цитировать Сообщить модератору
 Re: Как записать шифрованную строку в базу правильно?  [new]
aleks2
Guest
Kuanar
Здравствуйте! Помогите разобраться со следующей ситуацией:

Есть приложение который шифрует и дешифрует строку на Java. Теперь когда записываю этот шифрованную строку в базу он записывается искаженно.
Правильная строка выглядит так: +^ÖΖò‰M"€)¢ú(Ú$€â;ø··3$U§
А записывается в базу так: +^OI?o?M"?)?u(U$?a;o··?3$U§

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

СУБД - SQL Server 2008 R2
Тип поля - nvarchar(50)

Когда-нибудь до вас дойдет, что шифрованный ТЕКСТ (char) - суть БИНАРНЫЕ данные (binary).
14 дек 12, 09:28    [13629972]     Ответить | Цитировать Сообщить модератору
 Re: Как записать шифрованную строку в базу правильно?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31439
aleks2
Когда-нибудь до вас дойдет, что шифрованный ТЕКСТ (char) - суть БИНАРНЫЕ данные (binary).
В принципе это правильно, но вообще и в nvarchar, varchar должно без искажений сохраняться, так что ошибка где то на уровне работы java с субд. Хотя да, лучше переделать в бинари...
14 дек 12, 09:49    [13630028]     Ответить | Цитировать Сообщить модератору
 Re: Как записать шифрованную строку в базу правильно?  [new]
Kuanar
Member

Откуда:
Сообщений: 41
alexeyvg,

т.е. лучше преоброзовать string в binary и сохранить в базе в типе varbinary(50)? Можете подсказать как это делать?
14 дек 12, 10:04    [13630074]     Ответить | Цитировать Сообщить модератору
 Re: Как записать шифрованную строку в базу правильно?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31439
Kuanar
alexeyvg,

т.е. лучше преоброзовать string в binary и сохранить в базе в типе varbinary(50)? Можете подсказать как это делать?
Да, как то так. Непонятно правда, почему у вас изначально зашифрованная строка в string, а не в binary, но может в джаве так принято. Обычно для этого используют что то вроде байтового массива.
14 дек 12, 10:33    [13630171]     Ответить | Цитировать Сообщить модератору
 Re: Как записать шифрованную строку в базу правильно?  [new]
aleks2
Guest
alexeyvg
В принципе это правильно, но вообще и в nvarchar, varchar должно без искажений сохраняться

Это вы сами придумали?
14 дек 12, 12:13    [13630751]     Ответить | Цитировать Сообщить модератору
 Re: Как записать шифрованную строку в базу правильно?  [new]
Crimean
Member

Откуда:
Сообщений: 13148
aleks2
alexeyvg
В принципе это правильно, но вообще и в nvarchar, varchar должно без искажений сохраняться

Это вы сами придумали?


это зависит от настроек клиентской либы и от подмножества используемых символов :)
так что может работать, а может и не работать
было и такое, с BINARY - полностью поддерживаю
но на CHAR тоже можно оставаться, только придется постоянно ушами шевелить ну или удвоить занимаемое полем место
14 дек 12, 12:25    [13630880]     Ответить | Цитировать Сообщить модератору
 Re: Как записать шифрованную строку в базу правильно?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31439
aleks2
alexeyvg
В принципе это правильно, но вообще и в nvarchar, varchar должно без искажений сохраняться

Это вы сами придумали?
Да, сам, я это говорю на основании опыта работы с сиквелом. Во всех версиях (версиях с 6-й до 2008 R2, с которыми я работал) в varchar или text полях можно хранить любые данные, любой поток байтов, например, джипег-картинки или эксельные документы, всё нормально.
14 дек 12, 12:51    [13631173]     Ответить | Цитировать Сообщить модератору
 Re: Как записать шифрованную строку в базу правильно?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31439
Crimean
это зависит от настроек клиентской либы и от подмножества используемых символов :)
так что может работать, а может и не работать
Ну естественно нужно уметь правильно передать в сиквел эти данные. Если клиент исказит байты при попытке сохранить их в поле varchar, то будет плохо :-)

Но мы же сейчас говорим о принципиальной возможности, а не о наиболее простом и правильном способе.
14 дек 12, 12:53    [13631195]     Ответить | Цитировать Сообщить модератору
 Re: Как записать шифрованную строку в базу правильно?  [new]
aleks2
Guest
alexeyvg
aleks2
пропущено...

Это вы сами придумали?
Да, сам, я это говорю на основании опыта работы с сиквелом. Во всех версиях (версиях с 6-й до 2008 R2, с которыми я работал) в varchar или text полях можно хранить любые данные, любой поток байтов, например, джипег-картинки или эксельные документы, всё нормально.

1. А ничо, что в некоторых кодовых страницах кое-какие значения байт (символы) недопустимы?
2. Можно и гвозди компутером забивать.
3. Тока зачем?
4. Не учите плохому.
14 дек 12, 14:26    [13632024]     Ответить | Цитировать Сообщить модератору
 Re: Как записать шифрованную строку в базу правильно?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31439
aleks2
1. А ничо, что в некоторых кодовых страницах кое-какие значения байт (символы) недопустимы?
Ничего страшного, кодовые страницы нужны только для поиска, сравнения. Если не сравнивать строки, то кодовая страница не имеет значения.

aleks2
2. Можно и гвозди компутером забивать.
3. Тока зачем?
4. Не учите плохому.
Да я не учу, я же не возражал, что нужно хранить (и читать/передавать) в binary типах данных
14 дек 12, 14:49    [13632245]     Ответить | Цитировать Сообщить модератору
 Re: Как записать шифрованную строку в базу правильно?  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4951
На крайняк есть Base64.
14 дек 12, 15:08    [13632436]     Ответить | Цитировать Сообщить модератору
 Re: Как записать шифрованную строку в базу правильно?  [new]
Crimean
Member

Откуда:
Сообщений: 13148
ЕвгенийВ
На крайняк есть Base64.


ну! на "самый крайняк" можно писать и HEX представление. но это удвоит занимаемое место и потребует изменения логики работы
так что сменить тип поля на бинарь - оптимальный вариант
14 дек 12, 15:13    [13632477]     Ответить | Цитировать Сообщить модератору
 Re: Как записать шифрованную строку в базу правильно?  [new]
aleks2
Guest
alexeyvg
aleks2
1. А ничо, что в некоторых кодовых страницах кое-какие значения байт (символы) недопустимы?
Ничего страшного, кодовые страницы нужны только для поиска, сравнения. Если не сравнивать строки, то кодовая страница не имеет значения.


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

Я уж молчу про потенциальный геморрой с 0 (нулем) и пробелами в конце строки.
14 дек 12, 18:34    [13634210]     Ответить | Цитировать Сообщить модератору
 Re: Как записать шифрованную строку в базу правильно?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31439
aleks2
alexeyvg
пропущено...
Ничего страшного, кодовые страницы нужны только для поиска, сравнения. Если не сравнивать строки, то кодовая страница не имеет значения.


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

Я уж молчу про потенциальный геморрой с 0 (нулем) и пробелами в конце строки.
Ладно, уж признайте свою ошибку, чего там :-)

Прямо изливаетесь: "Наивный друг мой", "Это вы сами придумали?" :-) Пишите проще, если хотите поделиться какими то знаниями.

Могу повторить то, что писал выше, для ясности: можно хранить любые данные в полях символьного типа, сиквел и его библиотеки доступа и протоколы передачи данных этому не препятствуют, символов (точнее, байтов) не съедают, не искажают, не перекодируют (хранят чотко как есть :-) )
Разумеется, это не значит, что так хранить правильно, потому что могут быть проблемы с клиентом, а так же с поисками/сравнениями.

Все утверждения были правильные, нигде я не ошибся?
14 дек 12, 19:16    [13634435]     Ответить | Цитировать Сообщить модератору
 Re: Как записать шифрованную строку в базу правильно?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31439
alexeyvg
можно хранить любые данные в полях символьного типа, сиквел и его библиотеки доступа и протоколы передачи данных этому не препятствуют, символов (точнее, байтов) не съедают, не искажают, не перекодируют
На всякий случай набросал примерчик, если кто сомневается в микрософтовских библиотеках доступа:

Приложение (сохранить как файл с расширением VBS):
Set Conn = CreateObject("ADODB.Connection")
Set Cmd = CreateObject("ADODB.Command")
Set Param = CreateObject("ADODB.Parameter")

Conn.Open _
    "Provider=SQLOLEDB;Data Source=(local);" & _
        "Trusted_Connection=Yes;Initial Catalog=tempdb;"

Cmd.ActiveConnection = Conn
Cmd.CommandText = "SELECT ? as txt INTO TestTextTable"
Set Param = Cmd.CreateParameter("p", 200, 1, 5)

Param.Value = chr(0) + chr(1) + chr(2) + chr(3) + chr(4) 

Cmd.Parameters.Append Param
Set Param = Nothing
Cmd.Execute
Conn.Close
Wscript.Echo


Приложение создаст на сервере (local) в базе tempdb табличку TestTextTable с полем txt, в котором будет строка с 5 байтами, причём первый байт будет 0 (о ужас!)

Жмакнуть мышкой, потом в SSMS выполнить запрос, проверить, чего там перекодировалось:
select convert(varbinary(5), txt) from tempdb..TestTextTable

(No column name)
0x0001020304

всё нормально, все 5 байт на месте
14 дек 12, 19:52    [13634582]     Ответить | Цитировать Сообщить модератору
 Re: Как записать шифрованную строку в базу правильно?  [new]
aleks2
Guest
alexeyvg
Все утверждения были правильные, нигде я не ошибся?

1. Интересно, ошибку в чем я тут должно признать? Что не заколачиваю гвозди компутером?
2. С тобой уже поделились "знанием", но толку ни на грош.
3. Можешь поискать темы "ааа!!! я загружаю/выгружаю на/с сервера русские/французкие буковки, а лезут знаки '?'. Спасите!!! "
4. Так шо препятствуют.

declare @str varchar(32)
set @str = nchar(203) + nchar(201)+ ' дерьмо случается'
select @str, nchar(203), nchar(201)
15 дек 12, 07:05    [13635754]     Ответить | Цитировать Сообщить модератору
 Re: Как записать шифрованную строку в базу правильно?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31439
aleks2
1. Интересно, ошибку в чем я тут должно признать? Что не заколачиваю гвозди компутером?
Ошибка в том, что вы не представляете, как работает сиквел и средства доступа. После того, как вас поправили, можно было хотя бы в инете проискать, или у специалиста спросить. Стыдно не знать, что в varchar-строку можно записаит любой байт.

Мало того, вы вроде вначале с этим не спорили, просто спросили про источник информации. Потом оказалось, что это был не вопрос, а начало брызганья слюной :-) Вдвойне стыдно!
aleks2
2. С тобой уже поделились "знанием", но толку ни на грош.
Что то не видно знаний :-)
Откровения про "в некоторых кодовых страницах кое-какие значения байт (символы) недопустимы" - это не знания. Ну или примерчик пожалуйста, с эксепшеном от сиквела при попытке сохранить "неправильный байт для некоторой кодовой страницы", или с удалением или изменением этого байта.
aleks2
3. Можешь поискать темы "ааа!!! я загружаю/выгружаю на/с сервера русские/французкие буковки, а лезут знаки '?'. Спасите!!! "
Вот я про это и говорю - нужно учиться правильно программировать, а не переходить на binary, даже не попытавшись найти ошибку.

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

Да, примерчик тоже хорош, только к описанному случаю никак не относится. Правильный пример был постом выше.
15 дек 12, 12:49    [13636099]     Ответить | Цитировать Сообщить модератору
 Re: Как записать шифрованную строку в базу правильно?  [new]
aleks2
Guest
alexeyvg
Правильный пример был постом выше.


Коснейте в невежестве. Чо уж там.
15 дек 12, 13:06    [13636134]     Ответить | Цитировать Сообщить модератору
 Re: Как записать шифрованную строку в базу правильно?  [new]
Crimean
Member

Откуда:
Сообщений: 13148
aleks2,

а что показывает приведенный пример? проблемы при смешивании char + nchar? а каким боком это к записи bin контента в char поля?
16 дек 12, 14:43    [13638653]     Ответить | Цитировать Сообщить модератору
 Re: Как записать шифрованную строку в базу правильно?  [new]
aleks2
Guest
Crimean
aleks2,

а что показывает приведенный пример? проблемы при смешивании char + nchar? а каким боком это к записи bin контента в char поля?

1. Не, ну никто ж не запрещает ходить по граблям?
2. Ты видел код тредстартера?
3. Более-менее известно, только что пишет он в nvarchar. А вот из какого типа - неведомо.
4. Демонстрация косяков char->nvarchar затруднительна. Там нада с collation мутить. Мне лень.
16 дек 12, 15:25    [13638820]     Ответить | Цитировать Сообщить модератору
 Re: Как записать шифрованную строку в базу правильно?  [new]
aleks2
Guest
ms-help://MS.SQLCC.v10/MS.SQLSVR.v10.en/s10sq_GetStart/html/92d34f48-fa2b-47c5-89d3-a4c39b0f39eb.htm#Locale_Defn

The following table provides information about using multilingual data with various combinations of Unicode and non-Unicode servers.

Server
Client
Benefits or Limitations

Unicode
Non-Unicode
In this scenario, especially with connections between a server that is running a newer operating system and a client that is running an older version of SQL Server, or on an older operating system, there can be limitations or errors when you move data to a client computer. Unicode data on the server will try to map to a corresponding code page on the non-Unicode client to convert the data.

Тибе перевести?
16 дек 12, 15:41    [13638863]     Ответить | Цитировать Сообщить модератору
 Re: Как записать шифрованную строку в базу правильно?  [new]
Crimean
Member

Откуда:
Сообщений: 13148
aleks2,

ни, и переведу сам и про версии TDS знаю (сам пакеты разных версий "щупал" лично) и про причины проблем ТС "догадываюсь" ибо также "проходил" сей косяк, когда "внезапно" народ начал откровенный бинарь в чар поля писать а после выяснять, почему у них результат то есть то нет
16 дек 12, 16:05    [13638926]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить