2015-06-22 65 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); } } } 
      }; 
     } 

HMACSHA256HMACSHA384HMACSHA512不便攜 庫中存在。

首先,我嘗試用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

但是沒有文檔說明如何使用它。有人可以給我一個exmaple如何實施

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

這僅僅是一個跟進,因爲它顯示了谷歌。 PCLCrypto庫確實實現了所有的哈希方法,但不在PCL dll中。 PCL DLL只是一個存根,實際的實現在平臺特定的DLL中。

只要確保從所有項目中引用PCLCrypto庫,而不僅僅是PCL庫。

該技術被稱爲誘餌和開關,是因爲它允許最終應用到利用該系統的特定加密的API(更快的性能)

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