2015-07-21 66 views
-1

我正在開發需要驗證的Android應用程序。但是,現有的Web應用程序(使用Symfony)以及帳戶,我必須重複使用相同的帳戶來驗證我的用戶。如何驗證用戶? (Android/Java/Symfony)

在DB,我有basicals:用戶名,鹽,encryptedPassword,將encryption_type(SHA1)...

的問題是,我不知道如何使用這些信息我的用戶進行身份驗證。

如果有人能幫我解決這個問題...

非常感謝!

+0

在_Google_上搜索。 –

+0

應該實現通常的方法登錄(用戶名,密碼)。其他方法拋出異常,當它們在會話之外運行時(即沒有事先登錄)。 – greenmarker

回答

1

我終於成功地做到了!我已經分析了Symfony檢查密碼的方式,這要歸功於PHP類「PluginsfGuardUser」。

public final boolean authenticate(User user) 

    MessageDigest md = MessageDigest.getInstance(SHA1); 

    byte[] saltPassword = (user.getSalt() + user.getPassword()).getBytes(); 
    byte[] encryptedPassword = md.digest(saltPassword); 

    String pass = byteArrayToHexString(encryptedPassword); 

    if (pass.equals(user.getDbPassword())) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

private String byteArrayToHexString(byte[] array) { 
    String result = ""; 
    for (int i = 0; i < array.length; i++) { 
     result 
       += Integer.toString((array[i] & 0xff) + 0x100, 16).substring(1); 
    } 
    return result; 
} 
2

根據不同的加密算法,你會做這樣的事情:

public final boolean authenticate(String attemptedPassword, byte[] encryptedPassword, byte[] salt) throws NoSuchAlgorithmException, InvalidKeySpecException { 
    String algorithm = "PBKDF2WithHmacSHA1"; 
    int derivedKeyLength = 160; 
    int iterations = 20000; 
    KeySpec spec = new PBEKeySpec(password.toCharArray(), salt, iterations, derivedKeyLength); 
    SecretKeyFactory f = SecretKeyFactory.getInstance(algorithm); 

    byte[] encryptedPassword = f.generateSecret(spec).getEncoded(); 

    return Arrays.equals(encryptedPassword, encryptedAttemptedPassword); 
} 

你需要知道哪些設置被用來生成數據庫加密的密碼。

+0

derivedKeyLenght和迭代是否是設置的一部分? – QuentR

+0

是的,他們是。您必須在服務器和客戶端上使用相同的設置。 –

+0

感謝您的詳細信息,我會盡力。 – QuentR