2015-06-22 2 views
2

Я хочу, чтобы реализовать эту логику в портативном C# класс:C# PCL HMACSHAX с BouncyCastle-PCL

static JsonWebToken() 
     { 
      HashAlgorithms = new Dictionary<JwtHashAlgorithm, Func<byte[], byte[], byte[]>> 
      { 
       { JwtHashAlgorithm.HS256, (key, value) => { using (var sha = new HMACSHA256(key)) { return sha.ComputeHash(value); } } }, 
       { JwtHashAlgorithm.HS384, (key, value) => { using (var sha = new HMACSHA384(key)) { return sha.ComputeHash(value); } } }, 
       { JwtHashAlgorithm.HS512, (key, value) => { using (var sha = new HMACSHA512(key)) { return sha.ComputeHash(value); } } } 
      }; 
     } 

но HMACSHA256, HMACSHA384 и HMACSHA512 не существует в портативном библиотеке.

Сначала я пытаюсь с https://github.com/AArnott/PCLCrypto , но я всегда получаю: An exception of type 'System.NotImplementedException' occurred in PCLCrypto.dll but was not handled in user code

Я проверил то код, и я увидел Crpyto для PCL не выполняется и всегда сгенерирует исключение

Тогда я нашел эту библиотеку: https://github.com/onovotny/BouncyCastle-PCL

Но нет документации, как его использовать. Может ли кто-нибудь дать мне пример, как реализовать

var sha = new HMACSHA256(key) 
var sha = new HMACSHA384(key) 
var sha = new HMACSHA512(key) 

с BouncyCastle-PCL.

ответ

4

Попробуйте, как это для HmacSha256

public class HmacSha256 
    { 
     private readonly HMac _hmac; 

     public HmacSha256(byte[] key) 
     { 
      _hmac = new HMac(new Sha256Digest()); 
      _hmac.Init(new KeyParameter(key)); 
     } 

     public byte[] ComputeHash(byte[] value) 
     { 
      if (value == null) throw new ArgumentNullException("value"); 

      byte[] resBuf = new byte[_hmac.GetMacSize()]; 
      _hmac.BlockUpdate(value, 0, value.Length); 
      _hmac.DoFinal(resBuf, 0); 

      return resBuf; 
     } 
    } 

То же самое должно быть для двух других ...

+0

Я удалил свой предыдущий комментарий о том, Я не мог заставить его работать, так как это работает! Я только что изменил свой код, чтобы ближе соответствовать тому, что делает Java, но это тот бит, который мне нужен. Отличный маленький кусок кода, так спасибо за обмен! – Thierry

0

Это просто следить, потому что он показывает на Google. Библиотека PCLCrypto реализует все хэш-методы, но не в dll PCL. DLL PCL - это только заглушка, а фактические реализации находятся в специфических для платформы DLL.

Просто убедитесь, что вы ссылаетесь на библиотеку PCLCrypto из ВСЕХ ваших проектов, а не только на библиотеку PCL.

Методики называется приманка и выключателем, и используется, потому что она позволяет конечному приложение, чтобы использовать систему конкретный криптографический APIs (для повышения производительности)

См https://github.com/AArnott/PCLCrypto#installation