cryptage sha-256 dans Google Sheets à l'aide de scripts d'application
J'essaye de crypter 3 éléments différents dans un jeton d'authentification pour un en-tête http pour une API. Cette API est intégrée à Google Sheets et je ne peux rien utiliser d'autre pour le moment.
Le jeton d'authentification nécessite 4 parties:
- clé API
- Horodatage au format UTC
- Action de l'API
- Clé secrète API
Au format API KEY: TIMESTAMP: API ACTION: API Secret Key
Aux fins de cet exemple, disons que le
- La clé API est test123,
- Date UTC: jeu, 14 avril 2011 22:44:22 GMT
- L'action de l'API est "ledger"
- La clé secrète de l'API est UAV213Q
Lorsque j'ai testé l'exemple en utilisant le format suivant " test123: Thu, 14 Apr 2011 22:44:22 GMT: ledger: UAV213Q " en python, j'ai obtenu le résultat 15594d1f608134cbfa3075ecda4664519cd198738b8f5c3ffa2c95272b854199
C'est le script python que j'ai utilisé
def sha256():
# tested on Python 3.8.5
from urllib import parse, request
import hashlib
import datetime
from time import strftime, gmtime
# credentials and request params
my_merchant_id = 'apikey'
api_token = 'test123'
api_secret_key = 'UAV213Q'
my_timestamp = strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime())
api_version = 2.9
action_verb = 'ledger'
# set up request params
data = parse.urlencode({'merchantId': my_merchant_id, 'token': api_token,
'version': api_version, 'action': action_verb})
# authentication
sig = api_token + ':' + my_timestamp + ':' + action_verb + ':' + api_secret_key
sig_hash = hashlib.sha256(sig.encode('utf-8')).hexdigest()
my_headers = {'x-ShareASale-Date': my_timestamp,
'x-ShareASale-Authentication': sig_hash}
print(sig_hash)
J'ai essayé d'utiliser les solutions des autres questions StackOverFlow suivantes. Comment faire en sorte que Google Apps Script effectue le chiffrement SHA-256? , sha3-256 d'un texte de cellule dans Google Spreadsheet , toutes les suggestions.
Cependant, je continue à recevoir le message d'erreur "Cette fonction n'est pas autorisée à référencer une cellule avec NOW (), RAND () ou RANDBETWEEN ()."
J'ai essayé de référencer une cellule qui fait indirectement référence à NOW () en ayant NOW () dans A1 et en ayant B1 = A1, j'ai même essayé de la convertir en texte en utilisant TEXT ().
La clé API doit avoir l'horodatage pour fonctionner. Je pensais avoir cela calculé dans le script de l'application lui-même, car il s'agit d'une constante connue. Par exemple, dans le script de cryptage, il coderait en dur le jeton api, appellerait l'horodatage au format utc et coderait en dur la clé secrète de l'API dans le format correct et peut-être juste la fonction pour ajouter l'action afin que je puisse faire le changement afin que ce soit sha256 (grand livre) et il intégrerait cela dans le cryptage
Réponses
Et cette réponse?
Points de modification:
- Quand j'ai vu votre script python, j'ai confirmé que la spécification montrée dans votre question était différente de celle du script python.
- Il semble que ce
Thu, 14 Apr 2011 22:44:22 GMTsoitThu, 14 Apr 2011 22:44:22 +0000 - Il semble qu'il soit nécessaire d'utiliser "SHA_256" du condensé.
- Il semble que ce
Exemple de script:
Lorsque votre script python est converti en script Google Apps, il se présente comme suit. Veuillez le copier et le coller dans l'éditeur de script et exécuter la fonction myFunctiondans l'éditeur de script. Par cela, vous pouvez voir la valeur du résultat dans le journal.
function myFunction() {
const api_token = 'test123';
const api_secret_key = 'UAV213Q';
const my_timestamp = 'Thu, 14 Apr 2011 22:44:22 +0000';
const action_verb = 'ledger';
const value = `${api_token}:${my_timestamp}:${action_verb}:${api_secret_key}`;
const bytes = Utilities.computeDigest(Utilities.DigestAlgorithm.SHA_256, value);
const res = bytes.map(byte => ('0' + (byte & 0xFF).toString(16)).slice(-2)).join('');
console.log(res)
}
Résultat:
Lorsque test123:Thu, 14 Apr 2011 22:44:22 +0000:ledger:UAV213Qest utilisé pour le script Google Apps ci-dessus et votre script python, les deux résultats sont les mêmes comme suit.
8c3a6873fe71c402dc1e3ca7bc828712e3dfb7a66ed09feeeca2152dd809df81
Référence:
- computeDigest (algorithme, valeur)
Ajoutée:
Réponse à la question supplémentaire 1:
Lorsque vous souhaitez récupérer la chaîne de date comme Thu, 14 Apr 2011 22:44:22 +0000, veuillez utiliser le script suivant.
const my_timestamp = new Date().toUTCString().replace("GMT", "+0000");
Réponse à la question complémentaire 2:
Lorsque vous souhaitez récupérer la valeur en majuscules, veuillez utiliser le script suivant. Mais lorsque j'ai testé votre script python, la valeur du résultat est la minuscule. Alors faites attention à cela.
function myFunction() {
const api_token = 'test123';
const api_secret_key = 'UAV213Q';
const my_timestamp = 'Thu, 14 Apr 2011 22:44:22 +0000';
const action_verb = 'ledger';
const value = `${api_token}:${my_timestamp}:${action_verb}:${api_secret_key}`;
const bytes = Utilities.computeDigest(Utilities.DigestAlgorithm.SHA_256, value);
const res = bytes.map(byte => ('0' + (byte & 0xFF).toString(16)).slice(-2)).join('').toUpperCase();
console.log(res)
}
- Dans ce cas,
8C3A6873FE71C402DC1E3CA7BC828712E3DFB7A66ED09FEEECA2152DD809DF81est obtenu.
Références:
- toUTCString ()
- toUpperCase ()