Secure MAC for Grades Journey
Het MAC-beveiligingsmechanisme is een van de opties wanneer je Secure REST API hebt ingeschakeld tijdens het configureren van de goedkeuringswerkstroom of een extractie van de cijferlijst.
Genereer en valideer de MAC-waarde
Verifieer dat de waarde van de API-sleutel de waarde is die je verwacht, en valideer dan de waarde van de MAC-parameter:
Orden de API-sleutel en andere parameters alfabetisch op parameternaam.
Zet de waarden van de parameters in die volgorde samen in één enkele snaar.
Voeg de Shared Secret-waarde van het configuratiescherm Grades Journey toe aan de string die uit de vorige stap is verkregen.
Versleutel de string tot een string van 16 bytes met het MD5-algoritme (zie de volgende voorbeelden).
Converteer de 16-byte string naar een 32-byte alfanumerieke (hexadecimale) string voor URL-ondersteuning.
Vergelijk je gegenereerde MAC met de gegenereerde MAC van Blackboard die in het verzoek is doorgegeven.
Java-voorbeeld
/**
* 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;PHP-voorbeeld
/* 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;
}Perl-voorbeeld
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;
}