Search code examples
.netwindows-8windows-runtimewindows-store

How to create SHA-256 hashes in WinRT?


I went to create a simple one-way SHA-256 hash in WinRT today and realized it didn't work. I did a validation and apparently got this:

◦API System.Security.Cryptography.SHA256Managed in MSCORLIB, PUBLICKEYTOKEN=B77A5C561934E089 is not supported for this application type. CryptoWinRT.exe calls this API. ◦API System.Security.Cryptography.HashAlgorithm in MSCORLIB, PUBLICKEYTOKEN=B77A5C561934E089 is not supported for this application type. CryptoWinRT.exe calls this API. ◦API System.Security.Cryptography.SHA256Managed.#ctor in MSCORLIB, PUBLICKEYTOKEN=B77A5C561934E089 is not supported for this application type. CryptoWinRT.exe calls this API. ◦API System.Security.Cryptography.HashAlgorithm.ComputeHash(System.Byte[]) in MSCORLIB, PUBLICKEYTOKEN=B77A5C561934E089 is not supported for this application type. CryptoWinRT.exe calls this API.

What is the replacement for this? And why would such a trivial thing not be allowed in WinRT?


Solution

  • Does this work for you?

        private void HandleHashClick(object sender, RoutedEventArgs e)
        {
            // get the text...
            var inputText = this.textInput.Text;
    
            // put the string in a buffer, UTF-8 encoded...
            IBuffer input = CryptographicBuffer.ConvertStringToBinary(inputText, 
                BinaryStringEncoding.Utf8);
    
            // hash it...
            var hasher = HashAlgorithmProvider.OpenAlgorithm("SHA256");
            IBuffer hashed = hasher.HashData(input);
    
            // format it...
            this.textBase64.Text = CryptographicBuffer.EncodeToBase64String(hashed);
            this.textHex.Text = CryptographicBuffer.EncodeToHexString(hashed);
        }