16

他のクラス/アプリケーションが使用するOAuthURLを生成するポータブルクラスライブラリを構築しようとしています。OAuthを使用するこのクラスライブラリは、私が構築しているDropBox APIのさまざまなバージョンで動作できるように、ポータブルクラスライブラリである必要があります。

このクラスの一部は、oauth_signatureを生成するためにSHA1ハッシュを生成する必要があります。

ポータブルクラスライブラリがSystem.Security.Cryptographyをサポートしていないことを知っていますが、このクラスがそのクラスなしでSHA1ハッシュを生成できるということはありますか?

4

9 に答える 9

16

最も簡単な方法は、PCLCryptonugetパッケージを使用することだと思います。次に、次のことができます。

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();
}
于 2014-11-23T10:28:35.740 に答える
8

さて、私はこれがあまりにも最近必要でした、そして私はHashLibからSHA1実装をとることがはるかに簡単であるとわかりました:http://hashlib.codeplex.com/

モノラル実装には、いくつかの遠い依存関係(例外のローカリゼーションなど)がありますが、HashLibからは、変更を加えずにいくつかのファイルをコピーするだけで済みます。

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

合計55KBのコードなので、重すぎるものはありません。

于 2014-03-14T14:45:29.097 に答える
7

私はこのBouncyCastleNugetパッケージを使用しました:https ://www.nuget.org/packages/BouncyCastle-PCL/そしてそれは私にとっては問題なく動作します(クロスプラットフォームのWindows Store App、.Net Framework 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);
}
于 2015-01-09T13:43:28.087 に答える
6

Monoは、SHA1のマネージド実装を独自に提供しますmscorlib.dll(ただし、Mono.Security.dll@ CodeInChaosが提案するような場所にはありません)。

SHA1これはオープンソースであり、非常によくテストされており、Microsoftの実装とまったく同じように動作することを目的としています(たとえば、HashAlgorith...実装...から派生ICryptoTransform)ので、簡単にドロップインで置き換えることができます。

于 2012-04-20T23:10:24.337 に答える
2

SHA-1 Wikipediaの記事には、独自の実装のガイドラインとして使用できる擬似コードが含まれています。ただし、暗号化機能の場合と同様に、試行錯誤された実装を使用することを強くお勧めします。

SHA-256の実装が必要な場合は、ソースコード形式で入手できるBouncyCastleで見つけることができます。そこに関連するクラスはOrg.BouncyCastle.Crypto.Digests.Sha256Digestと呼ばれます(これがそのソースです)。

于 2012-04-20T23:01:06.423 に答える
2

新しい.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/

于 2017-04-19T08:33:21.213 に答える
1

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());
    }
于 2018-03-02T13:50:21.307 に答える
0

OAuthにも署名したかったので、PCL Cryptoを調べています。このテストでは、HmacSha1ハッシュの作成を示し、その結果を標準の.NETFrameworkの方法と比較します。

    [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]);
        }
    }
于 2017-01-11T06:10:49.320 に答える
0

私が同じ結果を達成しなければならなかったとき、これは私のために働きました。あなたも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/

于 2017-08-14T18:00:23.397 に答える