0

次の要件があります。

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("r14@17*$"));
    }
    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 : [B@9980d5
digestedPasswordPwd : [B@1d95492
[B@9980d5
    at java.lang.System.arraycopy(Native Method)
    at poc.HashedPassword.createPassword(HashedPassword.java:43)
    at poc.HashedPassword.main(HashedPassword.java:23)

どうすればいいのか教えてください

敬具

4

2 に答える 2

1

この行に問題があります:

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

から、位置 11 から始まるdigestedPassword.lengthバイトをコピーしようとします。そのため、そこにない 11 バイトをコピーしようとします。digestedPassword

代わりにこれを試してください:

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

System.arraycopyの API ドキュメントからコピーします。

それ以外の場合、次のいずれかが true の場合、IndexOutOfBoundsException がスローされ、宛先は変更されません。

srcPos 引数が負です。
destPos 引数が負です。
長さの引数が負です。
srcPos+length が、ソース配列の長さである src.length より大きい。
destPos+length は、デスティネーション配列の長さである dest.length よりも大きいです。

于 2012-10-16T09:13:14.703 に答える
1

まず第一に、あなたのコードから、パスワードからランダムなバイトを削除/分離することに関連するビットが欠落していると思います.したがって、決して等しくない可能性があります.

あなたの ArrayIndexOutOfBoundsException に関して、私が提案する、使用してください

System.arraycopy(digestedPassword, 0, resultBytes,0,digestedPassword.length);
于 2012-10-16T09:32:03.580 に答える