2016-07-13 4 views
1

Я боролся с вычислением стоимости дайджеста, и теперь у меня нет идей. Вот Пример XML и переваривать значение, генерируемое SoapUI:XML-подпись, ORACLE PLSQL, SHA1 вычисление значения вычисления

<ds:Reference URI="#TS-5C3C8278F62662ED251468430162870278"> 
    <ds:Transforms> 
     <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"> 
     <ec:InclusiveNamespaces PrefixList="wsse soapenv xsi" xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#"/> 
     </ds:Transform> 
    </ds:Transforms> 
    <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> 
    <ds:DigestValue>FP+KnVZ5S8C/RW6sBvulTUYYKAA=</ds:DigestValue> 
</ds:Reference> 

И ссылка:

<wsu:Timestamp wsu:Id="TS-5C3C8278F62662ED251468430162870278"> 
    <wsu:Created>2016-07-13T17:16:02.870Z</wsu:Created> 
    <wsu:Expires>2016-07-13T17:21:02.870Z</wsu:Expires> 
</wsu:Timestamp> 

Вот мой оракул код:

declare 
    l_clob clob; 
    l_hash raw(20); 
begin 
    select 
    xmlSerialize(
    document extract(
     xmlType('<wsu:Timestamp xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="TS-5C3C8278F62662ED251468429256802268"> 
     <wsu:Created>2016-07-13T17:00:56.802Z</wsu:Created> 
     <wsu:Expires>2016-07-13T17:05:56.802Z</wsu:Expires> 
     </wsu:Timestamp>'), '/*')) 
    into 
    l_clob 
    from 
    dual; 

    l_hash := dbms_crypto.Hash(
    l_clob, 
    DBMS_CRYPTO.HASH_SH1); 

    dbms_output.put_line(
    utl_raw.cast_to_varchar2(
     utl_encode.base64_encode(
     l_hash))); 
end; 
/

Выход: 5SiW/yo1nYIujurXbp5Ob9z6Mbs =

Примечание что я добавил пространство имен WSU в xml, так как без него я не могу быть канонализирован.

Без WSU имен и canonilization:

declare 
    l_clob clob := '<wsu:Timestamp wsu:Id="TS-5C3C8278F62662ED251468429256802268"><wsu:Created>2016-07-13T17:00:56.802Z</wsu:Created><wsu:Expires>2016-07-13T17:05:56.802Z</wsu:Expires></wsu:Timestamp>'; 
    l_hash raw(20); 
begin 
    l_hash := dbms_crypto.Hash(
    l_clob, 
    DBMS_CRYPTO.HASH_SH1); 

    dbms_output.put_line(
    utl_raw.cast_to_varchar2(
     utl_encode.base64_encode(
     l_hash))); 
end; 
/

Выход: tV9e2gUBqG9tgUXXwuc2M9/C798 =

Любые идеи, что я делаю неправильно?

ответ

0

Приведено в действие, что к элементу должно быть добавлено инклюзивное пространство имен, в этом примере «wsse soapenv xsi», а затем они должны быть заказаны, то есть «< ... soapenv: ... wsse: ... wsu: ... xsi: ... wsu: Id = ...> ... < ... /> ", только тогда можно рассчитать значение дайджеста.

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