如何正确创建SHA256哈希?

时间:2015-09-25 15:17:01

标签: c# sha256

我正在实现SSO,我必须在其中计算SHA256的字符串,然后将散列发送回端点,并在其中对用户进行身份验证。我通过执行以下操作使SHA1工作:

 var hash = SHA1.Create();
 var encoder = new ASCIIEncoding();
 byte[] combined = encoder.GetBytes(encryptedTokenStr);
 hash.ComputeHash(combined);
 string delimitedHexHash = BitConverter.ToString(hash.Hash);
 string completedSha1Hash = delimitedHexHash.Replace("-", "");

但是,如果我将哈希算法类型更改为SHA256,而另一个系统将哈希算法更改为SHA256 Salted (Suffix)不确定这是否与SHA256相同?以下代码无法正常工作,这意味着它不会在另一方面对用户进行身份验证:

var hash = SHA256.Create();
var encoder = new UTF8Encoding();
byte[] combined = encoder.GetBytes(encryptedTokenStr);
hash.ComputeHash(combined);
string delimitedHexHash = BitConverter.ToString(hash.Hash);
string completedSha1Hash = delimitedHexHash.Replace("-", "");

2 个答案:

答案 0 :(得分:1)

SHA256与" SHA256 Salted"。

不同

从技术上讲,它们都是SHA256,它只是输入的不同。在执行SHA256时,您可以散列数据本身。做"盐渍" (与你使用的哈希函数无关),你先添加一些" salt"输入(添加可能不同,但大多数情况下它只是串联;"后缀"暗示在输入后添加了盐),然后散列结果数据。

更多详情:https://en.wikipedia.org/wiki/Salt_%28cryptography%29

答案 1 :(得分:0)

在我的解决方案中,我使用以下内容(复制并粘贴就绪):

using System;
using System.Security.Cryptography;
using System.Text;

public string ComputeHash(string plainText, byte[] salt = null)
    {
        int minSaltLength = 4;
        int maxSaltLength = 16;

        byte[] saltBytes = null;

        if (salt != null)
        {
            saltBytes = salt;
        }
        else
        {
            Random r = new Random();
            int len = r.Next(minSaltLength, maxSaltLength);
            saltBytes = new byte[len];

            using (RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider())
            {
                rng.GetNonZeroBytes(saltBytes);
            }
        }
        byte[] plainData = ASCIIEncoding.UTF8.GetBytes(plainText);
        int plainLength = plainData.Length;
        int saltLength = saltBytes.Length;
        byte[] plainDataAndSalt = new byte[plainLength + saltLength];
        Array.Copy(plainData, 0, plainDataAndSalt, 0, plainLength);
        Array.Copy(saltBytes, 0, plainDataAndSalt, plainLength, saltLength);

        byte[] hashValue = null;

        using (SHA256Managed sha2 = new SHA256Managed())
        {
             hashValue = sha2.ComputeHash(plainDataAndSalt);
        }

        int hashLength = hashValue.Length;
        byte[] result = new byte[hashLength + saltLength];
        Array.Copy(hashValue, 0, result, 0, hashLength);
        Array.Copy(saltBytes, 0, result, hashLength, saltLength);

        return ASCIIEncoding.UTF8.GetString(result);
    }

解决您的问题/问题:

string hash = hash.ComputeHash("your string");

或者,如果服务器为您提供盐字符串:

byte[] salt = ASCIIEncoding.UTF8.GetBytes("server salt string in plaintext");
string hash = hash.ComputeHash("your string to hash", salt);

然后将哈希值返回给服务器。