在可移植类库中生成SHA1哈希

Tom*_*Tom 15 c# sha1 portable-class-library

我正在尝试构建一个可移植的类库,为其他类/应用程序生成OAuth URL.这个使用OAuth的类库必须是一个可移植的类库,因此它可以与我正在构建的DropBox API的不同版本一起使用.

此类的一部分需要生成SHA1哈希以生成oauth_signature.

我知道可移植类库不支持System.Security.Cryptography,所以无论如何这个类可以生成没有该类的SHA1哈希?

Glu*_*uip 16

我认为最简单的方法是使用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();
}
Run Code Online (Sandbox Code Playgroud)


rou*_*uen 8

好吧我最近也需要这个,我发现从HashLib获取SHA1实现要容易得多:http://hashlib.codeplex.com/

Mono实现有一些远程依赖(异常的本地化等),而从HashLib你只需要复制几个文件而不需要对它们进行任何更改:

Converters.cs
Hash.cs
HashBuffer.cs
HashCryptoNotBuildIn.cs
HashResult.cs
IHash.cs
SHA0.cs
SHA1.cs
Run Code Online (Sandbox Code Playgroud)

总共55 KB的代码,所以没有太重.


pou*_*pou 6

Mono 为它自己提供了SHA1托管实现mscorlib.dll(但它Mono.Security.dll不像@CodeInChaos建议的那样).

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


Min*_*yen 6

我已经使用这个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);
}
Run Code Online (Sandbox Code Playgroud)