Шифрование алгоритмов безопасности, поддерживаемых токеном JWT - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь подписать и закодировать мой JWt с помощью этого фрагмента:

var claims = new Claim[] { new SomeClaimes() };
var scKey = Encoding.UTF8.GetBytes("SOME KEY");
var ecKey = Encoding.UTF8.GetBytes("SOME OTHER KEY");
var tokenDescriptor = new SecurityTokenDescriptor {
    Subject = new ClaimsIdentity(claims),
    SigningCredentials = new SigningCredentials(
        new SymmetricSecurityKey(
            scKey),
            SecurityAlgorithms.HmacSha512),
    EncryptingCredentials = new EncryptingCredentials(
        new SymmetricSecurityKey(
            ecKey),
            // I tryied all possible combination of algorithms here:
            SecurityAlgorithms.XXXX,
            SecurityAlgorithms.YYYY), 
    Issuer = "My Jwt Issuer",
    Audience = "My Jwt Audience",
    IssuedAt = DateTime.UtcNow,
    Expires = DateTime.Now.AddDays(7),
};
var tokenHandler = new JwtSecurityTokenHandler();
var token = tokenHandler.CreateJwtSecurityToken(tokenDescriptor);
var jwt = tokenHandler.WriteToken(token);

Но когда я запускаю код, я получаю ошибку:

Шифрование не удалось.Нет поддержки для: Алгоритм: '{0}', SecurityKey: '{1}'.

Какие {0} и {1} представляют собой любую комбинацию XXXX и YYYY вКод выше (да, я написал фрагмент отражения и перепробовал все возможные комбинации).Какие поддерживаются алгоритмы кодирования (и декодирования) JWT со знаком?

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Наконец я нашел ответ:

var claims = new Claim[] { new SomeClaimes() };
var scKey = Encoding.UTF8.GetBytes("SOME KEY");
var ecKeyTemp = Encoding.UTF8.GetBytes("SOME OTHER KEY");

// Note that the ecKey should have 256 / 8 length:
byte[] ecKey = new byte[256 / 8];
Array.Copy(ecKeyTemp, ecKey, 256 / 8);

var tokenDescriptor = new SecurityTokenDescriptor {
    Subject = new ClaimsIdentity(claims),
    SigningCredentials = new SigningCredentials(
        new SymmetricSecurityKey(
            scKey),
            SecurityAlgorithms.HmacSha512),
    EncryptingCredentials = new EncryptingCredentials(
        new SymmetricSecurityKey(
            ecKey),
            SecurityAlgorithms.Aes256KW,
            SecurityAlgorithms.Aes256CbcHmacSha512), 
    Issuer = "My Jwt Issuer",
    Audience = "My Jwt Audience",
    IssuedAt = DateTime.UtcNow,
    Expires = DateTime.Now.AddDays(7),
};
var tokenHandler = new JwtSecurityTokenHandler();
var token = tokenHandler.CreateJwtSecurityToken(tokenDescriptor);
var jwt = tokenHandler.WriteToken(token);

Как вы могли видеть, используя SecurityAlgorithms.Aes256KW в качестве алгоритма шифрования ключа и SecurityAlgorithms.Aes256CbcHmacSha512 в качестве алгоритма шифрования сделает работу.Обратите внимание, что ключ, используемый для алгоритма шифрования, должен иметь длину 256 / 8.

0 голосов
/ 26 ноября 2018

HmacSha512 использует только один ключ для подписи или проверки токена, попробуйте алгоритм вроде RsaSha256 для шифрования с открытым / закрытым ключом.

...