2012-11-08 11 views
8

Sto migrando/convertendo/ricostruendo un'app di Windows Phone 7.1 a un'app di Windows 8 Store.Utilizzo di hmacsha256 nell'app di Windows Store

Un metodo che sto usando in de WP7 app mi sta dando problemi:

private byte[] GetSHA256Key(string data, string secretKey) 
{ 
    byte[] value = Encoding.UTF8.GetBytes(data); 
    byte[] secretKeyBytes = Encoding.UTF8.GetBytes(secretKey); 

    HMACSHA256 hmacsha256 = new HMACSHA256(secretKeyBytes); 

    byte[] resultBytes = hmacsha256.ComputeHash(value); 

    return resultBytes; 
} 

Guardando la documentazione per Windows Store Apps sono arrivato fino a questo nuovo codice, che speravo darebbe lo stesso risultato. Ma no. Sto facendo qualcosa di sbagliato Ma cosa?

private byte[] GetSHA256Key(string value, string secretKey) 
{ 
     // Create a MacAlgorithmProvider object for the specified algorithm. 
     MacAlgorithmProvider objMacProv = MacAlgorithmProvider.OpenAlgorithm(MacAlgorithmNames.HmacSha256); 

     // Create a buffer that contains the message to be signed. 
     IBuffer valueBuffer = CryptographicBuffer.ConvertStringToBinary(value, BinaryStringEncoding.Utf8); 

     // Create a key to be signed with the message. 
     IBuffer buffKeyMaterial = CryptographicBuffer.ConvertStringToBinary(secretKey, BinaryStringEncoding.Utf8); 
     CryptographicKey cryptographicKey = objMacProv.CreateKey(buffKeyMaterial); 

     // Sign the key and message together. 
     IBuffer bufferProtected = CryptographicEngine.Sign(cryptographicKey, valueBuffer); 

     DataReader dataReader = DataReader.FromBuffer(bufferProtected); 
     byte[] bytes = new byte[bufferProtected.Length]; 
     dataReader.ReadBytes(bytes); 

     return bytes; 
} 

Non sono un esperto di crittografia. Non sono sicuro di quello che sto facendo. Forse c'è qualcuno là fuori che può aiutarmi.

Thanx, JP

+0

"Un metodo che utilizzo nell'app WP7 mi dà problemi" perché? Metodi/classi mancanti? Eccezioni? I dettagli ti aiuteranno. – Will

risposta

1

nuovo HMACSHA256 (KEYDATA) utilizza una chiave come input, mentre MacAlgorithmProvider.CreateKey() utilizza l'ingresso come 'dati casuali utilizzati per contribuire a generare la chiave', che non è una chiave per HMAC algoritmo.

+0

Scusa Nickolay, non capisco. Come ho detto, non sono esperto in cose Crypto. Cosa intendi con nuovo HMACSHA256 (dati chiave)? –

+1

Intendevo che il costruttore per la classe HMACSHA256 utilizza i dati chiave come chiave stessa, mentre MacAlgorithmProvider.CreateKey - come input per il generatore di chiavi. –

+1

Non riesco più a utilizzare il nuovo HMACSHA256 (secretKeyBytes). Non è supportato in un'app di Windows Store. Quindi devo capire un altro modo. –

7
using System.Runtime.InteropServices.WindowsRuntime; 

private string GetSHA256Key(byte[] secretKey, string value) 
{ 
    var objMacProv = MacAlgorithmProvider.OpenAlgorithm(MacAlgorithmNames.HmacSha256); 
    var hash = objMacProv.CreateHash(secretKey.AsBuffer()); 
    hash.Append(CryptographicBuffer.ConvertStringToBinary(value, BinaryStringEncoding.Utf8)); 
    return CryptographicBuffer.EncodeToBase64String(hash.GetValueAndReset()); 
} 
+2

Aggiungi un contesto per spiegare perché il tuo codice risponde alla domanda dell'OP. – mdewitt

+0

Grazie per quello, quasi esattamente quello che stavo cercando. –