如何使用PCLCrypto中的现有密钥散列密码?

时间:2016-11-15 15:27:40

标签: xamarin.forms password-encryption

我正在创建一个连接到Web服务的移动应用程序。它需要使用密码登录系统。密码作为使用此方法进行哈希处理的MD5哈希密码存储在服务器上:

    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()));

在我的Xamarin PCL项目中无法使用在Web应用程序上散列密码的密钥和代码,因为无法在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();

提前感谢您的帮助。

2 个答案:

答案 0 :(得分: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);

希望有所帮助

答案 1 :(得分:-1)

仅仅使用哈希函数是不够的,只添加一个盐对提高安全性几乎没有作用。相反,使用随机盐在HMAC上进行大约100毫秒的持续时间并使用哈希值保存盐。使用PBKDF2,password_hash,Bcrypt等功能。重点是让攻击者花费大量时间通过暴力破解密码。

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

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

请参阅OWASP(开放式Web应用程序安全项目)Password Storage Cheat Sheet

请参阅Modern, Secure, Salted Password Hashing Made Simple

请参阅Jim Fenton的Toward Better Password Requirements