2012-10-16 50 views
0

我有以下要求。散列密碼並與MD5比較

1. save a user password converted to hash(digested) 
2. when comparing with data base, add random bytes with the password given from user 
3. now send the random bytes added password to DAO class 
4. separate the random byte from password 
5. compare with the stored hashed(digested) password 

我嘗試了一些相似的東西,但它給出了數組超出界限的異常。

package poc; 

import com.sun.xml.internal.ws.message.ByteArrayAttachment; 
import java.io.ByteArrayOutputStream; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.security.MessageDigest; 
import java.security.SecureRandom; 
import java.util.Arrays; 


public class HashedPassword { 
    public static final String CRYPTOGRAPHY_ALGORITHM = "MD5"; 
    public static final String CHAR_SET = "UTF8"; 
    public static void main(String[] arg){ 
     System.out.println(createPassword("[email protected]*$")); 
    } 
    public static byte[] createPassword(String password){ 
     byte[] salt = new byte[12]; 
     byte[] digestedPassword =null; 
     byte[] digestedPasswordPwd =null; 
     try { 
       SecureRandom random = new SecureRandom(); 
       random.nextBytes(salt); 
       MessageDigest mdPassword = MessageDigest.getInstance(CRYPTOGRAPHY_ALGORITHM); 
       MessageDigest mdPasswordPawd = MessageDigest.getInstance(CRYPTOGRAPHY_ALGORITHM); 

       mdPassword.update(salt); 
       mdPassword.update(password.getBytes(CHAR_SET)); 

       mdPasswordPawd.update(password.getBytes(CHAR_SET)); 
       digestedPassword = mdPassword.digest(); 
       digestedPasswordPwd = mdPasswordPawd.digest(); 
       byte[] resultBytes= new byte[1000]; 

       System.arraycopy(digestedPassword, 11, resultBytes,0,digestedPassword.length); 

       if(Arrays.equals(resultBytes, digestedPasswordPwd)){ 
        System.out.println("match"); 
       }else{ 
        System.out.println("no-match"); 
       } 

     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
     System.out.println("digestedPassword : "+digestedPassword); 
     System.out.println("digestedPasswordPwd : "+digestedPasswordPwd); 
     return digestedPassword; 
    } 

} 

堆棧跟蹤:

java.lang.ArrayIndexOutOfBoundsException 
digestedPassword : [[email protected] 
digestedPasswordPwd : [[email protected] 
[[email protected] 
    at java.lang.System.arraycopy(Native Method) 
    at poc.HashedPassword.createPassword(HashedPassword.java:43) 
    at poc.HashedPassword.main(HashedPassword.java:23) 

所以請幫助我如何去了解它

親切的問候

+0

後堆棧跟蹤請! – ppeterka

+0

感謝您的評論,更新了strack Trace。 –

+0

'digestedPassword = mdPassword.digest();'後面的digestedPassword數組的長度是多少? –

回答

1

此行有過錯:

System.arraycopy(digestedPassword, 11, resultBytes,0,digestedPassword.length); 

它試圖複製digestedPassword.length字節從digestedPassword,從位置11開始。因此,它試圖複製11個不在那裏的字節。

試試這個來代替:

System.arraycopy(digestedPassword, 11, resultBytes,0,digestedPassword.length-11); 

複製從API doc for System.arraycopy

否則,如果下列任何一項爲真,拋出IndexOutOfBoundsException和不修改目標:

srcPos參數爲負數。
destPos參數是否定的。
長度參數爲負值。
srcPos + length大於src.length,即源數組的長度。
destPos +長度大於dest.length,即目標數組的長度。

1

首先,我認爲從你的代碼中,你會錯過與從password中除去/分離隨機字節有關的位,所以它可能永遠不會相等。

關於你的ArrayIndexOutOfBoundsException異常,我建議

,請使用

System.arraycopy(digestedPassword, 0, resultBytes,0,digestedPassword.length);