Proteja o MAC para a Jornada de Notas
O mecanismo de segurança MAC é uma das opções quando você habilitou a REST API Segura ao configurar o fluxo de trabalho de aprovação ou um Boletim de Notas.
Gerar e validar o valor MAC
Valide que o valor da API Key é o valor que você espera, e então valide o valor do parâmetro MAC:
Ordene a API Key e outros parâmetros alfabeticamente pelo nome dos parâmetros.
Concatene os valores dos parâmetros nessa ordem em uma única cadeia.
Adicione o valor de Segredo Compartilhado da tela de configuração Jornada de Notas à string obtida na etapa anterior.
Criptografe a string em uma string de 16 bytes usando o algoritmo MD5 (veja os exemplos a seguir).
Converta a string de 16 bytes para uma string alfanumérica (hexadecimal) de 32 bytes para suporte a URL.
Compare seu MAC gerado com o MAC gerado pelo Blackboard que foi passado na solicitação.
Exemplo em Java
/**
* Calculates a secure MAC (message authentication code) from an array of strings and
shared secret.
* @param values – Parameters must first be sorted alphabetically by parameter name, then
the values of these sorted parameters passed to calculateSecureMac
* @param secret - the shared secret
* @return The calculated MAC
*/
private String calculateSecureMAC (final String[] values, final String secret) throws
NoSuchAlgorithmException
{
// concatenate param values
final int size = values.length;
String paramString = "";
for(int i=0; i<size; i++)
{
paramString += values[i];
}
// get md5 hash from ascii value and secret
final MessageDigest md = MessageDigest.getInstance("MD5");
final byte[] hashBytes = md.digest((paramString + secret).getBytes());
md.reset();
// convert to hex
String mac = "";
String hexByte;
for (int k=0; k<hashBytes.length; k++)
{
hexByte = Integer.toHexString(hashBytes[k] < 0 ? hashBytes[k] + 256 : hashBytes[k]);
mac += (hexByte.length()==1) ? "0" + hexByte : hexByte;
}
return mac;Exemplo de PHP
/* Calculates a MAC (message authentication code) from an array of strings and a secret.
Sort request parameters alphabetically by parameter name first, then pass values of sorted
parameters and shared secret to calculateSecureMac */
function calculateSecureMac($params, $secret)
{
// concatenate param values
$data = implode('', $params);
// get md5 of concatenated param values and secret
$mac = md5($data . $secret);
return $mac;
}Exemplo Perl
use Digest::MD5;
# Calculates a MAC (message authentication code) from an array of strings and a secret. Sort request parameters alphabetically by parameter name first, then pass values of sorted parameters and shared secret to calculateSecureMac
sub calculateSecureMac
{
my @args = @_;
$secret = pop(@args);
# concatenate param values
$data = join("", @args);
# get md5 of concatenated param values and secret
$ctx = Digest::MD5->new;
$ctx->add($data . $secret);
$mac = $ctx->hexdigest;
return $mac;
}