2016-11-15 131 views
-1

我正在创建一个连接到Web服务的移动应用程序。它需要使用密码登录到系统。密码存储服务器的MD5哈希密码使用这种方法散列上:如何使用PCLCrypto中的现有密钥来散列密码?

Byte[] Initial = <Key goes here> 
    MD5CryptoServiceProvider Provider = new MD5CryptoServiceProvider(); 
    List<Byte> Encoding = new List<Byte>(Initial); 
    Encoding.AddRange(ASCIIEncoding.ASCII.GetBytes(inputString)); 
    return Convert.ToBase64String(Provider.ComputeHash(Encoding.ToArray())); 

的钥匙和密码哈希的Web应用程序的密码不能在我Xamarin PCL项目中使用,因为这是不可能的在Xamarin PCL中使用'MD5CryptoServiceProvider'。

我需要在xamarin应用程序中创建一个等同的方法来对密码进行散列处理,然后再与Web服务版本进行比较。

要做到这一点,我选择了PCLCrypto,但我似乎无法找到任何地方包含原来用于加密密码的密钥。

这是Xamarin代码:

Byte[] Initial = <the same key as was used to originally cache it> 


    // step 1, calculate MD5 hash from input 
    var hasher = WinRTCrypto.HashAlgorithmProvider.OpenAlgorithm(HashAlgorithm.Md5); 

    byte[] inputBytes = Encoding.UTF8.GetBytes(inputString); 
    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(); 

在此先感谢您的帮助。

+0

为什么不直接使用Base64类的android?在这种情况下,你必须为每个平台实现它,但你不会头痛..只是一个建议.. –

+0

因为这是一个PCL项目。 – connersz

+0

好的..我们正在谈论xamarin表单项目的权利? 在每一个。平台创建 comparepasswords(userpwd,hashedpwd) {// 哈希userpwd和比较 //返回true或false } 使用扶养服务调用函数.. 因此,您将能够使用base64类。 –

回答

-1

只使用散列函数是不够的,只是添加盐没有提高安全性。取而代之的是用随机盐对HMAC进行大约100毫秒的持续时间并用散列表保存盐。使用PBKDF2,password_hash,Bcrypt等功能。关键是要让攻击者花费大量时间通过强力查找密码。

保护您的用户很重要,请使用安全的密码方法。

请参阅安全Stackexchange上的How to securely hash passwords, The Theory

请参阅OWASP(Open Web Application Security Project)Password Storage Cheat Sheet

Modern, Secure, Salted Password Hashing Made Simple

由吉姆·芬顿见Toward Better Password Requirements

+0

我无法更改Web服务因此不幸的是它需要使用完全相同的结果进行散列。 – connersz

0

我有一个解决方案,但我使用。平台特定的代码。 在xamarin.forms部分,你实现例如像一个接口:

public interface SpecificCodes 
    { 
     Boolean comparePasswords(String userPassword,String DBPassword); 
    } 

在xamarin.android您创建一个实现接口

[assembly:Dependency(typeof(MyProject.Droid.Code.SpecificPartsAndroid))] 
namespace MyProject.Droid.Code 
{ 

... 
    public class SpecificPartsAndroid: SpecificCodes 
    { 
     public Boolean comparePasswords(String userPassword, String DBPassword) 
     { 
      byte[] dig = hash(new Java.Lang.String(userPassword).GetBytes("UTF-8"),"MD5"); 
      byte[] res=Base64.Decode(DBPassword,Base64Flags.Default); 
      return String.Compare(dig.ToString(),res.ToString())==0?true:false; 
     } 
private static byte[] hash (byte[] toHash, String algorithm) 
     { 
      MessageDigest md = MessageDigest.GetInstance(algorithm); 
      return md.Digest(toHash); 
     } 
    } 
} 

在xamarin.ios做同样的 再一类调用函数在Xamarin.forms使用下面的代码

DependencyService.Get<SpecificCodes>().comparePasswords(pwdUser, pwdHashed); 

希望它可以帮助

+0

不要忘记[assembly:Dependency(typeof(MyProject.Droid.Code.SpecificPartsAndroid))] line .. –