es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Encripta una contraseña con Salesforce Apex utilizando SHA1.

Necesito escribir un código Apex de Salesforce que cifre una contraseña. Esto se utiliza para consultar una API externa para la cual las credenciales deben seguir este modelo de cifrado.

El cifrado de la contraseña de la API requiere 3 parámetros: una contraseña de usuario, una cadena aleatoria de 16 caracteres y una marca de tiempo en el formato 2022-01-06T17:01:22Z.

La fórmula es: outputKey = Base64(SHA1($randomString + $timestamp+ SHA1($userPassword)))

Un cifrado limpio daría el siguiente resultado:
Entradas:
Contraseña: peanutButter
Cadena aleatoria: uniqueCode123456
Marca de tiempo: 2022-01-06T17:01:22Z

Resultado esperado: FApp+ayrBcB5XUhygr9lFJLK1p0=

Mi código actualmente se ejecuta de la siguiente manera pero no entrega los resultados esperados. (Nota: las variables uniqueCode y timestamp se han codificado aquí de forma estática para simplificar, pero se generan en cada llamada de API).

String uniqueCode = 'uniqueCode123456';
String timestamp = '2015-09-30T14:12:15Z';
Blob password = Blob.valueOf('peanutButter');
Blob hashPassword = Crypto.generateDigest('SHA1', password);
String combinedPassword = uniqueCode + timeStamp + EncodingUtil.convertToHex(hashPassword);

Blob blobCombinedPassword = Blob.valueOf(combinedPassword);
Blob hashedFull = Crypto.generateDigest('SHA1', blobCombinedPassword);
String outputKey = EncodingUtil.base64encode (hashedFull);

¿Qué necesito hacer de manera diferente para generar la salida correcta?

Gracias

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para solicitar ayuda con tu código Salesforce Apex para cifrar una contraseña utilizando una fórmula específica, basándome en la información proporcionada, parece que el problema con tu código actual puede estar relacionado con la forma en que estás combinando la contraseña, la cadena aleatoria y la marca de tiempo.

    Para generar la salida correcta, deberás concatenar los tres parámetros en el orden correcto, sin caracteres adicionales ni espacios entre ellos. El orden correcto para la concatenación es: randomString + timestamp + SHA1(userPassword).

    Aquí tienes una versión actualizada de tu código que debería funcionar correctamente:

    String randomString = 'uniqueCode123456';
    String timestamp = '2022-01-06T17:01:22Z';
    String userPassword = 'peanutButter';
    
    Blob password = Blob.valueOf(userPassword);
    Blob hashPassword = Crypto.generateDigest('SHA1', password);
    
    String combinedPassword = randomString + timestamp + EncodingUtil.convertToHex(hashPassword);
    
    Blob blobCombinedPassword = Blob.valueOf(combinedPassword);
    Blob hashedFull = Crypto.generateDigest('SHA1', blobCombinedPassword);
    
    String outputKey = EncodingUtil.base64encode(hashedFull);
    
    System.debug('Output Key: ' + outputKey);
    

    En esta versión del código, hemos declarado las variables randomString, timestamp y userPassword y las hemos utilizado para generar la cadena combinedPassword en el orden correcto. Luego utilizamos esta cadena para crear un nuevo Blob y generar el hash SHA1, que finalmente codificamos en Base64 para producir la cadena outputKey.

    Espero que esto ayude y que el código actualizado resuelva el problema que estabas experimentando. ¡Avísame si tienes alguna otra pregunta o inquietud!

Comments are closed.