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

Xamarin.forms 如何使用PCLCrypto中的现有密钥散列密码?,xamarin.forms,password-encryption,Xamarin.forms,Password Encryption,我正在创建一个连接到web服务的移动应用程序。它需要使用密码登录到系统。密码作为MD5哈希密码存储在服务器上,该密码是使用以下方法哈希的: Byte[] Initial = <Key goes here> MD5CryptoServiceProvider Provider = new MD5CryptoServiceProvider(); List<Byte> Encoding = new List<Byte>(Initial);

我正在创建一个连接到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()));
字节[]首字母=
MD5CryptoServiceProvider=新的MD5CryptoServiceProvider();
列表编码=新列表(初始);
Encoding.AddRange(ascienceoding.ASCII.GetBytes(inputString));
返回Convert.ToBase64String(Provider.ComputeHash(Encoding.ToArray());
无法在我的Xamarin PCL项目中使用用于散列web应用程序上密码的密钥和代码,因为无法在Xamarin PCL中使用“MD5CryptoServiceProvider”

在将密码与web服务版本进行比较之前,我需要在xamarin应用程序中创建一个等效的方法来散列密码

为此,我选择了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();
字节[]首字母=
//步骤1,从输入计算MD5散列
var hasher=WinRTCrypto.HashAlgorithmProvider.OpenAlgorithm(HashAlgorithm.Md5);
byte[]inputBytes=Encoding.UTF8.GetBytes(inputString);
byte[]hash=hasher.HashData(inputBytes);
StringBuilder sb=新的StringBuilder();
for(int i=0;i

提前感谢您的帮助。

仅使用哈希函数是不够的,仅添加一个salt对提高安全性几乎没有什么作用。取而代之的是,在HMAC上随机添加盐,持续约100毫秒,并将盐与散列一起保存。使用PBKDF2、password_hash、Bcrypt等函数和类似函数。关键是让攻击者花费大量时间通过暴力手段查找密码

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

请参阅有关安全性的Stackexchange

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


见Jim Fenton:

我有一个解决方案,但我使用特定于平台的代码。 在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);
DependencyService.Get().comparePasswords(pwdUser,pwdHashed);

希望能有所帮助

为什么不直接使用android的Base64类?在这种情况下,您必须为每个平台实现它,但您不会感到头痛。。只是一个建议…因为这是一个PCL项目。好的。。我们在谈论xamarin表单项目,对吗?在每个平台中创建comparepasswords(userpwd,hashedpwd){//hash userpwd和compare//return true或false}使用依赖性服务调用函数。。因此,您将能够使用base64类。@Mr.Koçak您有代码示例吗?我还发现了一个对您来说可能很有趣的链接。。我没有检查内容,我无法更改web服务,因此它需要使用完全相同的结果进行散列。遗憾的是,不要忘记[assembly:Dependency(typeof(MyProject.Droid.Code.SpecificPartsAndroid))]行。。