我正在实现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("-", "");
答案 0 :(得分:1)
SHA256与" SHA256 Salted"。
不同从技术上讲,它们都是SHA256,它只是输入的不同。在执行SHA256时,您可以散列数据本身。做"盐渍" (与你使用的哈希函数无关),你先添加一些" salt"输入(添加可能不同,但大多数情况下它只是串联;"后缀"暗示在输入后添加了盐),然后散列结果数据。
答案 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);
然后将哈希值返回给服务器。