Java 在存储和检索MySQL时获取不同的加密密码和salt

Java 在存储和检索MySQL时获取不同的加密密码和salt,java,mysql,encryption,cryptography,bouncycastle,Java,Mysql,Encryption,Cryptography,Bouncycastle,我正在尝试使用salt加密密码并将其存储到MySQL数据库中。 我提到了这个 我的代码与此类似: private byte[] encrypt(String passwordToSave, byte[] salt) throws UnsupportedEncodingException { int seedBytes = 20; int hashBytes = 20; int iterations = 1000;

我正在尝试使用salt加密密码并将其存储到MySQL数据库中。 我提到了这个

我的代码与此类似:

private byte[] encrypt(String passwordToSave, byte[] salt)
    throws UnsupportedEncodingException
    {
        int seedBytes = 20;
        int hashBytes = 20;

        int iterations = 1000;

        if(null == salt)
        {
            SecureRandom rng = new SecureRandom();
            salt = rng.generateSeed(seedBytes);
        }
        PKCS5S2ParametersGenerator kdf = new PKCS5S2ParametersGenerator();

        kdf.init(passwordToSave.getBytes("UTF-8"), salt, iterations);

        byte[] hash =
            ((KeyParameter) kdf.generateDerivedMacParameters(8*hashBytes)).getKey();
        return hash;        
    }
我只是稍微修改了这个函数,以便将其用于这两个目的

  • 在创建用户帐户时加密密码,并将其与salt一起存储
  • 当用户尝试登录时,使用数据库中存储的salt对用户密码进行加密,并使用password的存储值进行检查
  • 问题是,, 我不会取回我储存的东西。 我用了很多不同的东西

  • 我使用
    Base64
    进行编码,并将其存储到数据库中,然后在取回时使用相同的方法进行解码
  • 我尝试使用
    VARBINARY
    BLOB
    保存byte[]数据,但没有成功
  • 然后我使用了
    VARCHAR
    ,通过使用
    “UTF-8”
    编码类型从中创建一个新字符串来存储
    字节[]
  • 我对密码学一无所知,所以如果我错了,请指出。 提前感谢。:)

    编辑:

    运行加密两次时的输出:

    Salt : [34, 17, -80, -59, 93, -90, 37, -25, -11, -43, 44, 1, 10, 7, -66, -108, 97, 36, 95, -116]
    First Attempt: [-76, -3, 114, -69, 78, 21, -59, 23, 127, -15, 114, -106, -52, 23, 34, 91, 123, 6, 76, -115]
    Second Attempt: [-76, -3, 114, -69, 78, 21, -59, 23, 127, -15, 114, -106, -52, 23, 34, 91, 123, 6, 76, -115]
    Salt : [34, 17, -80, -59, 93, -90, 37, -25, -11, -43, 44, 1, 10, 7, -66, -108, 97, 36, 95, -116]
    

    你也在储存盐吗?然后当你第二次加密时,你使用的是同一种盐吗?如果每次使用不同的盐进行加密,将得到不同的结果…是的,我也在保存盐。我只是从数据库中得到不同的值。好的,把数据库完全从等式中去掉-只需使用完全相同的参数连续调用
    encrypt
    两次,然后显示字节数组输出。@JonSkeet:我只是将字节[]进行sysout。可以吗?不,这不会显示字节-它只会打印类似
    [B@6d6de4e1
    它根本不指示数组的内容。Base64编码它,或使用
    数组。toString(byte[])