【问题标题】:Implementing WS-Security in Progress ABL在 ABL 中实施 WS-Security
【发布时间】:2014-11-25 04:03:29
【问题描述】:

我正在努力实现 WS-Security in Progress ABL。

似乎有可能,这个知识库:http://knowledgebase.progress.com/articles/Article/P88147 状态:

  • 对于传出 WS-Security,请使用 OpenEdge Web Service 客户端手动创建包含 WS-Security 内容的 SOAP 标头。

首先,我正在努力创建一个 base64 编码和 SHA1 消化的密码哈希。

根据 WS-Security 规范的密码摘要。 Source.

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

Nonce 是一个特定长度的随机字符串,基本上可以是一个 UUID。 nonce 是 Base64 编码的(它在 soap 标头中编码发送)。

Created 是格式为“YYYY-MM-DDTHH:MM:SS.SSSZ”的日期。毫秒是可选的。应始终设置 GMT 的 Z。

密码是网络服务商提供的密码。

试图在 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 的事实有关?

注意

使用这个简单的代码,我可以很容易地产生与上面引用的问题中提到的相同的错误哈希:

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

【问题讨论】:

    标签: soap ws-security progress-4gl openedge


    【解决方案1】:

    如果没有指定长度,PUT-STRING 会将一个以 NULL 结尾的字符串放入您的 MEMPTR - 这就是您需要将长度设置为 + 1 的原因 - 这是 'Can't PUT past the end 的错误解决方案MEMPTR 的。 (4791)'

    从 SET-SIZE 中删除 + 1 并将密码更改为:

    PUT-STRING(mBytes, 1 + LENGTH(cNonceDecoded) + LENGTH(pcCreated), LENGTH(pcPassword)) = pcPassword。

    【讨论】:

    • 像魅力一样工作!我有一个想法是这样的,我记得之前 NULL 曾经咬过我......
    • 但是,它不适用于我收到的其他示例。像这个:ASSIGN cNonce = "VVBXZ0xIVW4=" cTimeStamp = "2014-10-01T07:20:26:660Z" cClearPass = "AMADEUS" cRightAnswer = "OljgJAghr3NZdXJaQNPRCbJg+XE=". 它产生另一个散列(bLj...)。可能与输入数据的不同格式(base64 等)有关?
    • 如果我理解正确,时间戳可以随心所欲地格式化,只要你保持一致 - 但是 07:20:26:660Z 看起来很奇怪 - 那不应该是 07:20 :26.660Z?您如何确定您收到的示例 /is/ 正确?
    • 好点。我没有看到最后一个冒号。改变它并没有给我更好的结果。我不能 100% 确定我收到的示例是正确的,但在这一点上,我比我自己的算法更信任它们......
    • 我刚刚尝试了一个soapUI 生成的(请参阅soapui.org/SOAP-and-WSDL/applying-ws-security.html 了解如何配置)- 工作正常。分配 cNonce = "ByduiuimrJgTaJvn/dE2NQ==" cTimeStamp = "2014-10-02T21:07:32.632Z" cClearPass = "AMADEUS" cRightAnswer = "bwiAWNgKf3Lz5Tir7IuDtKiTMT0=".
    猜你喜欢
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    • 2019-02-09
    • 2014-03-02
    • 2014-02-18
    • 2013-09-03
    • 1970-01-01
    相关资源
    最近更新 更多