0
votes

Générez HMAC SHA1 avec une charge utile évasée Unicode, Oracle Plsql

J'ai donc un point final des ORDS (services de données de repos Oracle) qui reçoit une charge utile JSON de Facebook API et une variable, X-HUB-Signature, qui se trouve dans l'en-tête de la demande.

Je dois valider La demande que je reçois, donc je sais que c'est de Facebook. P>

Je dois générer un hachage qui reçoit la charge utile (blob) et une clé (chaîne) que Facebook et moi-même partagent (app_secret), puis Je la comparifie à la valeur de X-Hub-Signature, afin que je puisse confirmer que c'est une demande valide. p>

problème est, explique Facebook: "Veuillez noter que nous générons la signature à l'aide d'une version Unicode évasée de la charge utile, avec des chiffres hexadécimaux minuscules. Si vous calculez simplement contre les octets décodés, vous vous retrouverez avec une signature différente. Par exemple, la chaîne ¤Ã¶ ¥ devrait être échappé à \ u00e4 \ u00f6 \ u00e5. " P>

Jusqu'à présent, mes hachages sont une correspondance aux charges utiles que je reçois, mais j'ai essayé avec ces personnages ¤Ã ¥ et je ne peux pas Sachez bien si cela fonctionne, car toutes les codeurs en ligne HMAC ne semblent pas que bien et que je ne sais pas comment leicode les échapper (sur les codeurs en ligne). P>

Jusqu'à présent, j'ai ceci: P>

FUNCTION validate_payload (p_x_hub_signature      in     varchar2,
                           p_json_payload         in     blob)
RETURN varchar2
IS
    v_app_secret        varchar2(4000) := '2f2f2f2f2f2f2f';
    l_mac               raw(10000);
    v_x_hub_signature   varchar2(4000);

BEGIN

    l_mac := dbms_crypto.mac (src => p_json_payload,
                              typ => dbms_crypto.hmac_sh1,
                              key => UTL_I18N.STRING_TO_RAW (v_app_secret, 'AL32UTF8'));

    v_x_hub_signature := 'sha1='||lower(l_mac);

    return v_x_hub_signature;      

END;


3 commentaires

Comment gérez-vous "\" ou "\ u" dans votre chaîne?


Qu'en est-il du personnage à l'extérieur du BMP , c'est-à-dire ci-dessus U + FFFF ?


Java Tool Native2Acii fait exactement ce qui s'échappe. Cependant, vous devez appeler un binaire externe, vous ne pouvez donc pas le faire natif dans PL / SQL.


3 Réponses :


0
votes

Voici une solution PL / SQL. Cela nécessite moins de codage que la proposition de Sentinel et pourrait être plus clair.

declare
    v_app_secret varchar2(100) := 'äaöå ab\ABC';
    escaped varchar2(100);
    item varchar2(6);
begin

    escaped := replace(regexp_replace(ASCIISTR(v_app_secret), '\\([[:xdigit:]]{4})', '\u\1'), '\u005C', '\\');

    for i in 1..regexp_count(escaped, '\\u[[:xdigit:]]{4}') loop
        item := regexp_substr(escaped, '\\u[[:xdigit:]]{4}', 1, i);
        escaped := replace(escaped, item, lower(item));        
    end loop;
    dbms_output.put_line(escaped);

end;


\u00e4a\u00f6\u00e5 ab\\ABC


2 commentaires

v_app_secret n'a pas besoin d'être traduit, mais le p_json_payload fait. Cette méthode pourrait finir par faire des milliers (ou plus) ou des appels redondants vers regexp_substr et religieuses, Manipulez-le dans Pure SQL.


Wow, merci Wernfried Domschéit, je vais essayer votre méthode! J'apprécie vraiment votre aide, merci beaucoup. Je vais fournir des commentaires dès que je peux sur ceci. Merci encore



0
votes

Commencer la méthode de @wernfried Domscheit d'utiliser ascitr code> et regexp_replace code>, il peut être étendu à une liste complète des remplacements pour obtenir les versions minuscules:

create or replace function Escape_Unicode(pCLOB clob) RETURN clob is
BEGIN
  return  regexp_replace(
            regexp_replace(
              regexp_replace(
                regexp_replace(
                  regexp_replace(
                    regexp_replace(
                      regexp_replace(
                        regexp_replace(
                          regexp_replace(
                            regexp_replace(
                              regexp_replace(
                                regexp_replace(
                                  regexp_replace(
                                    regexp_replace(
                                      regexp_replace(
                                        regexp_replace(
                                          regexp_replace(
                                            regexp_replace(
                                              regexp_replace(
                                                regexp_replace(
                                                  regexp_replace(
                                                    regexp_replace(
                                                      regexp_replace(
                                                        regexp_replace(
                                                          regexp_replace(
                                                            regexp_replace(
                                                              asciistr(pClOB)
                                                              , '\\A([[:xdigit:]]{3})'
                                                              , '\\a\1'
                                                            )
                                                            , '\\B([[:xdigit:]]{3})'
                                                            , '\\b\1'
                                                          )
                                                          , '\\C([[:xdigit:]]{3})'
                                                          , '\\c\1'
                                                        )
                                                        , '\\D([[:xdigit:]]{3})'
                                                        , '\\d\1'
                                                      )
                                                      , '\\E([[:xdigit:]]{3})'
                                                      , '\\e\1'
                                                    )
                                                    , '\\F([[:xdigit:]]{3})'
                                                    , '\\f\1'
                                                  )
                                                  , '\\([[:xdigit:]])A([[:xdigit:]]{2})'
                                                  , '\\\1a\2'
                                                )
                                                , '\\([[:xdigit:]])B([[:xdigit:]]{2})'
                                                , '\\\1b\2'
                                              )
                                              , '\\([[:xdigit:]])C([[:xdigit:]]{2})'
                                              , '\\\1c\2'
                                            )
                                            , '\\([[:xdigit:]])D([[:xdigit:]]{2})'
                                            , '\\\1d\2'
                                          )
                                          , '\\([[:xdigit:]])E([[:xdigit:]]{2})'
                                          , '\\\1e\2'
                                        )
                                        , '\\([[:xdigit:]])F([[:xdigit:]]{2})'
                                        , '\\\1f\2'
                                      )
                                      , '\\([[:xdigit:]]{2})A([[:xdigit:]])'
                                      , '\\\1a\2'
                                    )
                                    , '\\([[:xdigit:]]{2})B([[:xdigit:]])'
                                    , '\\\1b\2'
                                  )
                                  , '\\([[:xdigit:]]{2})C([[:xdigit:]])'
                                  , '\\\1c\2'
                                )
                                , '\\([[:xdigit:]]{2})D([[:xdigit:]])'
                                , '\\\1d\2'
                              )
                              , '\\([[:xdigit:]]{2})E([[:xdigit:]])'
                              , '\\\1e\2'
                            )
                            , '\\([[:xdigit:]]{2})F([[:xdigit:]])'
                            , '\\\1f\2'
                          )
                          , '\\([[:xdigit:]]{3})A'
                          , '\\\1a'
                        )
                        , '\\([[:xdigit:]]{3})B'
                        , '\\\1b'
                      )
                      , '\\([[:xdigit:]]{3})C'
                      , '\\\1c'
                    )
                    , '\\([[:xdigit:]]{3})D'
                    , '\\\1d'
                  )
                  , '\\([[:xdigit:]]{3})E'
                  , '\\\1e'
                )
                , '\\([[:xdigit:]]{3})F'
                , '\\\1f'
              )
              , '\\([[:xdigit:]]{4})'
              , '\u\1'
            )
            , '\\u005c'
            , '\\\\'
          );
end;
/
select escape_unicode('äöå ab\ABCd') from dual;


0 commentaires

0
votes

Je viens de réaliser, je pourrais vous avoir induit en erreur. Comme sentinelle mentionné, v_app_secret n'a pas besoin d'être traduit, seul p_json_payload, qui est une blob.

Jusqu'à présent, j'ai monté cela: Pensez-vous que tout va bien? Je n'ai aucun moyen de savoir à coup sûr: / xxx


0 commentaires