¿Existe alguna solución menos complicada para la siguiente tarea?

Para trabajar con API, necesito calcular la firma usando la fórmula a continuación. El problema proviene de las comillas dobles en el cuerpo de la solicitud, se almacenaron como \" no como ".

El código siguiente genera texto 1570702210SoMeF@ke123456[{ "id": "123", "title": "foo", "version": "2019-10-10 10:10:10 } ]}SoMeF@ke123456 y el hash correcto es "b6e783309e9d6f8ee47647373a9f6086020b3af8" de http: // www. sha1-online.com/

Fórmula de firma: hex (sha1 ({GMT_UNIXTIME} + {API_SECRET} + {CONTENT} + {API_SECRET})), donde

  • hex () - función que convierte datos binarios en formato hexadecimal
  • sha1 () - función hash estándar SHA-1, debe devolver datos binarios
    • concatenación de cadenas de texto
  • {API_SECRET}: una clave secreta que se emite junto con el inicio de sesión {API_LOGIN}
  • {CONTENT}: cuerpo de la solicitud

El siguiente código da una firma incorrecta "c7a7ecbb0fd2d6eebfb378bdd061ea88d9fb2f69".

 library(stringr)
 library(lubridate)
 library(digest)


API_SECRET <- 'SoMeF@ke123456'
mstime <- ymd_hms('2019-10-10 10:10:10')
my_id <- 123
title1 <- 'foo'

request_body_json <- paste0('[{ "id": "', my_id,'", "title": "', title1, '", "version": "', mstime, '  } ]}')

rbj1 <- paste0(round(as.numeric(mstime)), API_SECRET, request_body_json, API_SECRET)

signature <- digest(rbj1, algo = "sha1")

Veo una solución alternativa para guardar la cadena en el archivo con la función cat() y calcular la firma del archivo, que da la firma correcta "b6e783309e9d6f8ee47647373a9f6086020b3af8"

cat(paste0(round(as.numeric(mstime)), API_SECRET, request_body_json, API_SECRET), file = 'rbj.txt')

signature <- digest('rbj.txt', algo = "sha1", file = TRUE) 
0
Yuriy Barvinchenko 18 oct. 2019 a las 13:49

1 respuesta

La mejor respuesta

Evite que la entrada se serialice:

digest(rbj1, algo = "sha1", serialize = FALSE)

[1] "b6e783309e9d6f8ee47647373a9f6086020b3af8"
1
27 ϕ 9 18 oct. 2019 a las 12:41