我试图建立一个便携式类库生成的OAuth网址,其他类/应用程序使用。 使用OAuth这个类库必须是便携式类库,因此它可与不同版本的DropBox的API我建立的工作。
这个类的部分需要生成一个SHA1哈希生成与oauth_signature。
我知道,便携式类库不支持System.Security.Cryptography,所以是有反正,这个类可以产生无阶级的SHA1哈希?
我试图建立一个便携式类库生成的OAuth网址,其他类/应用程序使用。 使用OAuth这个类库必须是便携式类库,因此它可与不同版本的DropBox的API我建立的工作。
这个类的部分需要生成一个SHA1哈希生成与oauth_signature。
我知道,便携式类库不支持System.Security.Cryptography,所以是有反正,这个类可以产生无阶级的SHA1哈希?
Mono提供一个SHA1的管理实现了它自己的mscorlib.dll
(但它不是位于Mono.Security.dll
像@CodeInChaos建议)。
它是开源的,很好的测试,旨在表现得完全像微软实现(例如,它派生自SHA1
, HashAlgorith
...实现ICryptoTransform
...),所以它应该是一个简单的简易替换。
我认为,最简单的方法是使用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();
}
嗯,我需要这也最近,我发现更容易采取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的代码总量的,所以没有什么太沉重。
我已经使用这个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);
}
该SHA-1维基百科的文章包含的伪代码,你可以为自己实施的指导使用。 但是,一如既往地与加密功能,我强烈建议使用久经考验的执行。
假设你要一个SHA-256的实现,你可以找到一个在BouncyCastle的 ,这是源代码的形式提供。 相关类有一个名为Org.BouncyCastle.Crypto.Digests.Sha256Digest(这里是它的源 )。
你可能想看看新的.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/
我想签的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]);
}
}
这为我工作,当我不得不实现相同的效果。 你可以做到这一点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/
下面是使用一个例子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());
}