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 Réponses :
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
v_app_secret code> n'a pas besoin d'être traduit, mais le
p_json_payload code> fait. Cette méthode pourrait finir par faire des milliers (ou plus) ou des appels redondants vers
regexp_substr code> 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
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;
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: / p>
Comment gérez-vous
"\" code> ou
"\ u" code> dans votre chaîne?
Qu'en est-il du personnage à l'extérieur du BMP , c'est-à-dire ci-dessus
U + FFFF code>?
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.