Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Soap 在ABL中实现WS-Security_Soap_Ws Security_Progress 4gl_Openedge - Fatal编程技术网

Soap 在ABL中实现WS-Security

Soap 在ABL中实现WS-Security,soap,ws-security,progress-4gl,openedge,Soap,Ws Security,Progress 4gl,Openedge,我正在努力在ABL中实现WS-Security 似乎有可能,此知识库:声明: 对于传出的WS-Security,使用OpenEdge Web服务客户端手动创建包含WS-Security内容的SOAP头 首先,我正在努力创建base64编码和SHA1摘要密码哈希 根据WS-Security规范的密码摘要 Nonce是特定长度的随机字符串,基本上可以是UUID。nonce是Base64编码的(它在soap头中被编码发送) 创建的日期是格式为“YYYY-MM-DDTHH:MM:SS.SSSZ”的日

我正在努力在ABL中实现WS-Security

似乎有可能,此知识库:声明:

  • 对于传出的WS-Security,使用OpenEdge Web服务客户端手动创建包含WS-Security内容的SOAP头
首先,我正在努力创建base64编码和SHA1摘要密码哈希

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

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

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

密码是由web服务提供商提供的密码

试图模仿这个答案,所以:

我猜这可能是因为我弄乱了mempointer处理,或者是因为所有东西都应该是UTF-8

NB

我可以使用以下简单代码轻松生成上述参考问题中提到的相同错误哈希:

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

如果未指定长度,PUT-STRING会将以NULL结尾的字符串放入MEMPTR中-这就是为什么需要将长度设置为+1的原因-这是错误的解决方案,即“不能超过MEMPTR的结尾”。(4791)"

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


PUT-STRING(兆字节,1+长度(cNonceDecoded)+长度(pcCreated),长度(pcPassword))=pcPassword。

就像一个符咒!我有一个想法是这样的,我记得NULL以前咬过我……但是,我收到的其他例子都不起作用。像这样:
ASSIGN cnence=“VVBXZ0xIVW4=”cTimeStamp=“2014-10-01T07:20:26:660Z”cClearPass=“AMADEUS”cRightAnswer=“OljgJAghr3NZdXJaQNPRCbJg+XE=”。
它会产生另一个散列(bLj…)。可能与输入数据的不同格式(base64等)有关?如果我理解正确,时间戳可以按您喜欢的方式格式化,只要您保持一致-但是07:20:26:660Z看起来很奇怪-这不应该是07:20:26.660Z吗?你如何确定你收到的例子/是/正确的?很好。我没有看到最后一个冒号。但改变它并不能给我更好的结果。我不能100%确定我收到的示例是正确的,但在这一点上,我更信任它们,而不是我自己的算法……我只是尝试了一个soapUI生成的算法(请参见如何配置)——效果很好。分配cNonce=“ByduiuimrJgTaJvn/dE2NQ=”cTimeStamp=“2014-10-02T21:07:32.632Z”cClearPass=“AMADEUS”cRightAnswer=“bwiawngkkf3lz5tir7iudtkitmt0=”。
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?".
MESSAGE STRING(BASE64-ENCODE(SHA1-DIGEST("UIYifr1SPoNlrmmKGSVOug==" + "2009-12-03T16:14:49Z" + "test8"))) VIEW-AS ALERT-BOX