2016-11-15 6 views
-1

私は、Webサービスに接続するモバイルアプリケーションを作成しています。パスワードを使用してシステムにログインする必要があります。それは不可能ですので、私のXamarin PCLプロジェクトで使用することができないWebアプリケーションのパスワードをハッシュする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())); 

キーやコード:パスワードは、この方法を使用してハッシュされたMD5ハッシュ化されたパスワードなどのサーバーに保存されていますXamarin PCLで 'MD5CryptoServiceProvider'を使用する。

xamarinアプリケーションで、Webサービスのバージョンと比較する前にパスワードをハッシュするのと同等のメソッドを作成する必要があります。

これを行うにはPCLCryptoを選択しましたが、元々パスワードを暗号化するのに使用されたものと同じキーを含む場所を見つけることができませんでした。あなたの助けを事前に

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

ありがとう:

これはXamarinコードです。

+0

なぜBase64クラスのAndroidを直接使用しないのですか?その場合は、各プレートフォーム用に実装する必要がありますが、頭痛を覚えることはありません..ちょっとアドバイス.. –

+0

それはPCLプロジェクトですから。 – connersz

+0

OK ..私たちはxamarinフォームプロジェクトについて話していますか?あなたは comparepasswords(userpwd、hashedpwd) 作成した各plateformで 関数を呼び出す 使用の依存サービス{ //ハッシュuserpwdをして //比較は trueまたはfalseを返します} .. したがって、base64クラスを使用することができます。 –

答えて

-1

ハッシュ関数を使用するだけでは不十分で、単に塩を追加するだけでセキュリティを向上させることはほとんどありません。代わりに、約100msの持続時間の間、ランダムな塩でHMACを繰り返し、塩をハッシュで保存してください。 PBKDF2、password_hash、Bcryptなどの関数を使用します。要点は、攻撃者が無差別にパスワードを見つけるのに多くの時間を費やすことです。

ユーザーを保護することは重要です。安全なパスワード方法を使用してください。

Security 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

ウェブサービスを変更できません残念なことに、同じ結果を得てハッシュする必要があります。 – connersz

0

私は解決策を持っているが、私はplateform固有のコードを使用します。 xamarin.formsで あなたは例えばのようなインターフェイスを実装するパート:xamarin.androidで

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

あなたはxamarin.iosでインターフェース

[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); 
     } 
    } 
} 

を実装するクラスを作成するのと同じ を行い、その後に

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

はそれが

を役に立てば幸いXamarin.forms

に以下のコードを使用して、あなたの関数を呼び出します
+0

[assembly:Dependency(typeof(MyProject.Droid.Code.SpecificPartsAndroid))]行を忘れないでください。 –

関連する問題