2014-09-30 3 views
0

Я борюсь с внедрением WS-Security в процессе ABL.Выполнение WS-Security в процессе ABL

Представляется возможным, это база знаний: http://knowledgebase.progress.com/articles/Article/P88147 состояния:

  • Для исходящего WS-Security, создать SOAP-заголовки, содержащие содержимое WS-Security вручную с помощью клиента OpenEdge Web Service.

Прежде всего, я борюсь с созданием кодировкой Base64 и SHA1 хэш пароля переваривается.

Пароль переваривается в соответствии со спецификацией WS-Security. Source.

Password_Digest = Base64 (SHA-1 (nonce + created + password)) 

Нонс случайная строка определенной длины, в основном может быть UUID. Nonce кодируется Base64 (он отправляется в заголовок мыла).

Дата создания - это дата в формате «ГГГГ-ММ-ДДХ: ММ: СС.ССС». Миллисекунды являются необязательными. Z для GMT всегда должен быть установлен.

Пароль является паролем, предоставленным поставщиком веб-услуг.

Попытка имитировать этот ответ на SO: Working algorithm for PasswordDigest in WS-Security

PROCEDURE generatePassHash: 
    DEFINE INPUT PARAMETER pcNonce AS CHARACTER NO-UNDO. 
    DEFINE INPUT PARAMETER pcCreated AS CHARACTER NO-UNDO. 
    DEFINE INPUT PARAMETER pcPassword AS CHARACTER NO-UNDO. 

    DEFINE OUTPUT PARAMETER pcHash  AS CHARACTER NO-UNDO. 

    DEFINE VARIABLE mBytes  AS MEMPTR  NO-UNDO. 
    DEFINE VARIABLE cNonceDecoded AS CHARACTER NO-UNDO. 

    /* Base64-decode the nonce since it's in encoded format */ 
    ASSIGN 
     cNonceDecoded = STRING(BASE64-DECODE(pcNonce)). 

    /* Set size of mempointer */ 
    SET-SIZE(mBytes) = LENGTH(cNonceDecoded) + LENGTH(pcCreated) + LENGTH(pcPassword) + 1. 

    /* Put the decoded nonce first */ 
    PUT-STRING(mBytes, 1) = cNonceDecoded. 

    /* Add create time */ 
    PUT-STRING(mBytes, 1 + LENGTH(cNonceDecoded)) = pcCreated. 

    /* Add password */ 
    PUT-STRING(mBytes, 1 + LENGTH(cNonceDecoded) + LENGTH(pcCreated)) = pcPassword. 

    /* Create out-data */ 
    pcHash = STRING(BASE64-ENCODE(SHA1-DIGEST(mBytes))). 

    /* Clean up mempointer */ 
    SET-SIZE(mBytes) = 0. 


END PROCEDURE. 

DEFINE VARIABLE cNonce  AS CHARACTER NO-UNDO. 
DEFINE VARIABLE cTimeStamp AS CHARACTER NO-UNDO. 
DEFINE VARIABLE cClearPass AS CHARACTER NO-UNDO. 
DEFINE VARIABLE cRightAnswer AS CHARACTER NO-UNDO. 

ASSIGN 
    cNonce  = "UIYifr1SPoNlrmmKGSVOug==" 
    cTimeStamp = "2009-12-03T16:14:49Z" 
    cClearPass = "test8" 
    cRightAnswer = "yf2yatQzoaNaC8BflCMatVch/B8=". 

RUN generatePassHash(cNonce, cTimeStamp, cClearPass, OUTPUT cHash). 

MESSAGE "Is:" SKIP cHash SKIP(2) 
    "Should be:" SKIP 
    cRightAnswer 
    VIEW-AS ALERT-BOX INFORMATION TITLE "OK?". 

Я предполагаю, что это, возможно, придется сделать либо с меня портя обращение mempointer или тот факт, что все должно быть UTF-8?

NB

Я могу легко произвести тот же ошибочный хэш, как указано в упомянутой выше вопрос с помощью этого простого кода:

MESSAGE STRING(BASE64-ENCODE(SHA1-DIGEST("UIYifr1SPoNlrmmKGSVOug==" + "2009-12-03T16:14:49Z" + "test8"))) VIEW-AS ALERT-BOX 

ответ

1

PUT-STRING будет, если не указано длины, положить строка NULL с завершающим символом в ваш MEMPTR - поэтому вам нужно было установить длину до + 1 - это было неправильное решение для «Can not PUT past the end of MEMPTR». (4791)»

Удалить + 1 из SET-SIZE и изменить пароль для:

PUT-STRING (МБайт 1 + ДЛИНА (cNonceDecoded) + ДЛИНА (pcCreated), ДЛИНА (pcPassword)) = pcPassword.

+0

Работает как очарование! У меня была идея, что это было что-то вроде этого, и я помню, что NULL укусил меня раньше ... – Jensd

+0

Однако это не работает на других примерах, которые я получил. Как это: 'ASSIGN cNonce = "VVBXZ0xIVW4 =" cTimeStamp = "2014-10-01T07: 20: 26: 660Z" cClearPass = "AMADEUS" cRightAnswer = "OljgJAghr3NZdXJaQNPRCbJg + ХЕ ="' It. производит другой хеш (bLj ...). Возможно, это связано с различными форматами (base64 и т. Д.) Входных данных? – Jensd

+1

Если я правильно понял, отметка времени может быть отформатирована, но вам нравится, если вы согласны - но 07: 20: 26: 660Z выглядит странно - не должно быть 07: 20: 26.660Z? Как вы уверены, что пример, который вы получили/является/правильным? –

 Смежные вопросы

  • Нет связанных вопросов^_^