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字节digestedPassword。因此它尝试复制不存在的 11 个字节。

试试这个:

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

API 文档复制 System.arraycopy

否则,如果以下任何一项为真,则抛出 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 回答