生成SHA1哈希便携式类库(Generate SHA1 Hash in Portable Class

2019-06-23 20:16发布

我试图建立一个便携式类库生成的OAuth网址,其他类/应用程序使用。 使用OAuth这个类库必须是便携式类库,因此它可与不同版本的DropBox的API我建立的工作。

这个类的部分需要生成一个SHA1哈希生成与oauth_signature。

我知道,便携式类库不支持System.Security.Cryptography,所以是有反正,这个类可以产生无阶级的SHA1哈希?

Answer 1:

Mono提供一个SHA1的管理实现了它自己的mscorlib.dll (但它不是位于Mono.Security.dll像@CodeInChaos建议)。

它是开源的,很好的测试,旨在表现得完全像微软实现(例如,它派生自SHA1HashAlgorith ...实现ICryptoTransform ...),所以它应该是一个简单的简易替换。



Answer 2:

我认为,最简单的方法是使用PCLCrypto NuGet包 。 然后,你可以这样做:

private static string CalculateSha1Hash(string input)
{
        // step 1, calculate MD5 hash from input
        var hasher = WinRTCrypto.HashAlgorithmProvider.OpenAlgorithm(HashAlgorithm.Sha1);
        byte[] inputBytes = Encoding.UTF8.GetBytes(input);
        byte[] hash = hasher.HashData(inputBytes);

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < hash.Length; i++)
        {
            sb.Append(hash[i].ToString("X2"));
        }
        return sb.ToString();
}


Answer 3:

嗯,我需要这也最近,我发现更容易采取SHA1实现从HashLib: http://hashlib.codeplex.com/

单执行有一定的范围广泛的依赖(例外的定位,等等),而来自HashLib你只需要拷贝几个文件,而无需在他们的任何变化:

Converters.cs
Hash.cs
HashBuffer.cs
HashCryptoNotBuildIn.cs
HashResult.cs
IHash.cs
SHA0.cs
SHA1.cs

55 KB的代码总量的,所以没有什么太沉重。



Answer 4:

我已经使用这个BouncyCastle的NuGet包: https://www.nuget.org/packages/BouncyCastle-PCL/和它工作得很好,我(跨平台的Windows Store应用.NET框架4.5,Silverlight的5,的Windows Phone 8, Xamarin.Android,Xamarin.iOS)

使用HMACSHA1产生这样的签名:

public string GenerateSignature(string key, string signatureBase)
{
   var keyBytes = Encoding.UTF8.GetBytes(key);
   HMACSHA1 hashAlgorithm = new HMACSHA1(keyBytes);            
   byte[] dataBuffer = Encoding.UTF8.GetBytes(signatureBase);
   byte[] hashBytes = hashAlgorithm.ComputeHash(dataBuffer);
   return Convert.ToBase64String(hashBytes);
}


Answer 5:

该SHA-1维基百科的文章包含的伪代码,你可以为自己实施的指导使用。 但是,一如既往地与加密功能,我强烈建议使用久经考验的执行。

假设你要一个SHA-256的实现,你可以找到一个在BouncyCastle的 ,这是源代码的形式提供。 相关类有一个名为Org.BouncyCastle.Crypto.Digests.Sha256Digest(这里是它的源 )。



Answer 6:

你可能想看看新的.NET标准库:

https://docs.microsoft.com/en-us/dotnet/articles/standard/library

它是便携, System.Security.Cryptography被包括在内。

    /// <summary>
    /// Compute hash for string encoded as UTF8
    /// </summary>
    /// <param name="input">String to be hashed.</param>
    /// <returns>40-character hex string.</returns>
    public static string GetSha1(string input)
    {
        using (var sha1 = System.Security.Cryptography.SHA1.Create())
        {
            byte[] inputBytes = Encoding.UTF8.GetBytes(input);
            byte[] hash = sha1.ComputeHash(inputBytes);

            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < hash.Length; i++)
            {
                sb.Append(hash[i].ToString("X2"));
            }
            return sb.ToString();
        }
    }

你也可以得到一些帮助(用于创建与.NET标准库一PCL项目)在这里:

https://xamarinhelp.com/dot-net-standard-pcl-xamarin-forms/



Answer 7:

我想签的OAuth也和我在看PCL加密 - 此测试显示HMACSHA1哈希的创造,并将结果与​​标准的.NET框架的方式。

    [Test]
    public void CreateHash_VersusComputeHash_ReturnsEquivalent()
    {
        // USING TRADITIONAL .NET:
        var key = new byte[32];
        var contentBytes = Encoding.UTF8.GetBytes("some kind of content to hash");
        new RNGCryptoServiceProvider().GetBytes(key);

        var alg = new HMACSHA1(key); // Bouncy castle usage does not differ from this
        var result = alg.ComputeHash(contentBytes);




        // USING PCL CRYPTO:
        var algorithm = WinRTCrypto.MacAlgorithmProvider.OpenAlgorithm(MacAlgorithm.HmacSha1);

        byte[] mac;
        using (var hasher = algorithm.CreateHash(key))
        {
            hasher.Append(contentBytes);
            mac = hasher.GetValueAndReset();
        }




        // Assert results:
        Assert.AreEqual(result.Length, mac.Length);

        for (var i = 0; i < result.Length; i++)
        {
            Assert.AreEqual(result[i], mac[i]);
        }
    }


Answer 8:

这为我工作,当我不得不实现相同的效果。 你可以做到这一点SHA512和别人太。

using System.Security.Cryptography;

public static string HashSHA1(this string value)
{
    using (var sha = SHA1.Create())
    {
       return Convert.ToBase64String(sha.ComputeHash(System.Text.Encoding.UTF8.GetBytes(value)));
    }
}

代码引自: https://xamarinhelp.com/cryptography-in-xamarin-forms/



Answer 9:

下面是使用一个例子BouncyCastle的

    public static string ComputeSha1(string data)
    {
        var sha1Digest = new Org.BouncyCastle.Crypto.Digests.Sha1Digest();
        var hash = new byte[sha1Digest.GetDigestSize()];

        var dataBytes = Encoding.UTF8.GetBytes(data);
        foreach (var b in dataBytes)
        {
            sha1Digest.Update(b);
        }
        sha1Digest.DoFinal(hash, 0);

        return string.Join("", hash.Select(b => b.ToString("x2")).ToArray());
    }


文章来源: Generate SHA1 Hash in Portable Class Library