AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 02.07.2008, 20:22   #21  
IvanOFF is offline
IvanOFF
MCTS
MCBMSS
 
65 / 87 (3) ++++
Регистрация: 22.09.2005
Адрес: Москва
Цитата:
Сообщение от AndyD Посмотреть сообщение
Класс рассчитывает hash-суммы на основе алгоритмов MD2, MD4, MD5, SHA. В реализации используется CryptAPI, входящее в состав Windows.
Здравствуйте!
Использую Ваш класс hash для шифрования строки. На моей машине с WinXP все шифруется нормально. Заметил, что при запуске клиента аксапты на сервере (проверял на 2-х серверах - Windows Server 2000 SP4 и Windows Server 2003 SP2) строка не шифруется из-за того, что метод acquireContext() класса hash отрабатывает по-разному на Windows XP и на сервере (пока это лишь предположение, что проблема в операционной системе). Текст метода:

X++:
#define.PROV_RSA_FULL(1)
#define.CRYPT_NEWKEYSET(0x00000008)
private void AcquireContext()
{
    DLLFunction _CryptAcquireContext = new DLLFunction(_dll, "CryptAcquireContextA");
    Binary      prov = new Binary(4);
    ;
    _CryptAcquireContext.returns(ExtTypes::DWord);
    _CryptAcquireContext.arg(ExtTypes::Pointer, ExtTypes::DWord, ExtTypes::DWord,
                                ExtTypes::DWord, ExtTypes::DWord);
    prov = new Binary(4);
    if (!_CryptAcquireContext.call(prov, 0, 0, #PROV_RSA_FULL, 0))
        _prov = 0;
    else
        _prov = prov.dWord(0);
}
На сервере _CryptAcquireContext.call(prov, 0, 0, #PROV_RSA_FULL, 0) возвращает false, на моем WinXP - true.

На msdn нашел описание функции CryptAcquireContext:
CryptAcquireContext - The CryptAcquireContext function is used to acquire a handle to a specified key container in a specified cryptographic service provider (CSP). The phProv parameter receives the handle to the specified key container. You can use this handle to call other API functions.

В чем может быть проблема? Сначала думал, что, вероятно, на сервере не запущен какой-то процесс. Но вроде не в этом дело.
Буду благодарен, если выскажете идеи на этот счет.
Старый 03.07.2008, 09:44   #22  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Попробуй поменять в методе AcquireContext код на следующий
X++:
#define.PROV_RSA_FULL(1)
#define.CRYPT_NEWKEYSET(0x00000008)

#define.NTE_BAD_KEYSET( 0x80090016 )

private void AcquireContext()
{
    DLLFunction _CryptAcquireContext = new DLLFunction(_dll, "CryptAcquireContextA");
    Binary      prov = new Binary(4);
    int         err;
    ;
    _CryptAcquireContext.returns(ExtTypes::DWord);
    _CryptAcquireContext.arg(ExtTypes::Pointer, ExtTypes::String, ExtTypes::DWord,
                                ExtTypes::DWord, ExtTypes::DWord);
    prov = new Binary(4);
    if (!_CryptAcquireContext.call(prov, "AxaptaKeyset", 0, #PROV_RSA_FULL, 0))
    {
        err = winapi::getLastError();
        if (err == #NTE_BAD_KEYSET)
        {
            if (!_CryptAcquireContext.call(prov, "AxaptaKeyset", 0, #PROV_RSA_FULL, #CRYPT_NEWKEYSET))
            {
                _prov = 0;
            }
            else
            {
                _prov = prov.dWord(0);
            }
        }
    }
    else
        _prov = prov.dWord(0);
}
Имя кейсета можно поставить какое нужно. Или ставить 0 как раньше, что бы создался keyset по умолчанию
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: IvanOFF (1).
Старый 03.07.2008, 12:13   #23  
RumataEstor is offline
RumataEstor
очами вижу
 
84 / 19 (1) ++
Регистрация: 29.04.2008
Адрес: Москва
Цитата:
Сообщение от IvanOFF Посмотреть сообщение
На сервере _CryptAcquireContext.call(prov, 0, 0, #PROV_RSA_FULL, 0) возвращает false, на моем WinXP - true.
Код:
BOOL WINAPI CryptAcquireContext(
  __out         HCRYPTPROV* phProv,
  __in          LPCTSTR pszContainer,
  __in          LPCTSTR pszProvider,
  __in          DWORD dwProvType,
  __in          DWORD dwFlags
);
When pszContainer is NULL, a default key container name is used. For example, the Microsoft Base Cryptographic Provider uses the logon name of the currently logged on user as the key container name. Other CSPs can also have default key containers that can be acquired in this way.

Может, на сервере currently logged on user неопределен?
Старый 03.07.2008, 15:59   #24  
IvanOFF is offline
IvanOFF
MCTS
MCBMSS
 
65 / 87 (3) ++++
Регистрация: 22.09.2005
Адрес: Москва
Цитата:
Сообщение от AndyD Посмотреть сообщение
Попробуй поменять в методе AcquireContext код на следующий
Спасибо! Теперь все работает.

Цитата:
Сообщение от RumataEstor Посмотреть сообщение
Может, на сервере currently logged on user неопределен?
А как его определить?
Старый 03.07.2008, 16:14   #25  
RumataEstor is offline
RumataEstor
очами вижу
 
84 / 19 (1) ++
Регистрация: 29.04.2008
Адрес: Москва
Цитата:
Сообщение от IvanOFF Посмотреть сообщение
А как его определить?
Очевидно, выполнять код не от системной учетной записи, а от имени какого-нибудь пользователя. То, что у вас все заработало говорит о том, что этот параметр как раз и создавал проблему. Когда вы его установили в некоторое значение, то имя пользователя уже стало ненужным.
Старый 19.11.2012, 22:04   #26  
AvrDen is offline
AvrDen
Участник
 
134 / 26 (1) +++
Регистрация: 04.08.2005
Адрес: Усть-Каменогорск
Добрый день!
Использую класс Hash, за который огромное спасибо! Возникла проблема что на Windows Server 2008 R2 64x шифрование не происходит, а на 7-ке 32x все работает отлично. Не подскажете как ее решить или в каком направлении двигаться?
Старый 19.11.2012, 22:57   #27  
handy-comp is offline
handy-comp
Участник
 
96 / 78 (3) ++++
Регистрация: 27.09.2012
Так и должно быть на 64-bit OS.
В зависимости от того какие функции нужны, можно воспользоваться функционалом .Net или поискать готовую стороннюю .Net сборку, например: http://cryptapi.sourceforge.net/home.html

Последний раз редактировалось handy-comp; 19.11.2012 в 23:02.
Старый 20.11.2012, 06:17   #28  
Tarrash is offline
Tarrash
Участник
 
41 / 11 (1) +
Регистрация: 03.08.2005
У нас тоже возникла подобная проблема.
handy-comp, вы дали ссылку на библиотеку CryptAPI. Не подскажете, кто-нибудь уже использовал данную сборку? Коллеги, может кто решал проблему альтернативным способом?
Старый 20.11.2012, 10:39   #29  
handy-comp is offline
handy-comp
Участник
 
96 / 78 (3) ++++
Регистрация: 27.09.2012
Из этой сборки использовал функцию для blowfish алгоритма но не в Ax проекте.
Если необходим только MD5 hash думаю лучше использовать стандартные возможности .Net.
За это сообщение автора поблагодарили: Tarrash (1).
Старый 20.11.2012, 11:54   #30  
Tarrash is offline
Tarrash
Участник
 
41 / 11 (1) +
Регистрация: 03.08.2005
Цитата:
Сообщение от handy-comp Посмотреть сообщение
Из этой сборки использовал функцию для blowfish алгоритма но не в Ax проекте.
Если необходим только MD5 hash думаю лучше использовать стандартные возможности .Net.
Спасибо за совет. Попробуем воспользоваться возможностями класса:
System.Security.Cryptography.MD5CryptoServiceProvider
Старый 20.11.2012, 12:52   #31  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от 6apcyk Посмотреть сообщение
Посоветуйте, какой стандартный объект можно использовать для следующего:
Цитата:
Сообщение от Vadik Посмотреть сообщение
также см. класс KeySum
послушайте совета от Vadik: посмотрите сначала на KeySum.
и не майтесь ерундой.
Старый 20.11.2012, 13:07   #32  
someOne is offline
someOne
Участник
Аватар для someOne
 
173 / 429 (15) +++++++
Регистрация: 11.12.2008
Адрес: Москва
Вот пример текста готовой функции хеширования MD5 на NET для AX2009.

Может пригодится кому...

X++:
static void Job159(Args _args)
{
    System.Security.Cryptography.MD5    md5;
    System.Text.Encoding                encoding;
    System.Byte                 byte;
    System.Text.StringBuilder   stringBuilder;
    System.Array                array;
    int                         i;
    int                         len;
    str                         _text2Hash = "ggg";
    str                         md5code;
    ;
    new InteropPermission(InteropKind::ClrInterop).assert();

    md5 = System.Security.Cryptography.MD5::Create();
    
    encoding = System.Text.Encoding::GetEncoding(0);
    

    array = md5.ComputeHash(encoding.GetBytes(_text2Hash));

    stringBuilder = new System.Text.StringBuilder();
    
    len = array.get_Length();

    for (i = 0; i < len; i++)
    {
        byte = array.GetValue(i);

        stringBuilder.Append(byte.ToString("x2"));
    }

    md5code = stringBuilder.ToString();
    
    info(md5code);
}
За это сообщение автора поблагодарили: Daiver (1), AvrDen (1), altap (1).
Теги
шифрование

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Нужно срочно дописать запрос помогите CRASH_505 DAX: Программирование 3 09.09.2008 10:49
помогите с DLL ZhanR DAX: Программирование 2 13.09.2006 12:31
Помогите с запросом.. DarkBear DAX: Программирование 2 15.08.2005 13:38
Помогите найти доку vitart DAX: Администрирование 18 03.07.2003 16:10
Ребята плиз помогите! Данные! niksa DAX: Программирование 6 17.12.2002 19:16

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 01:49.