2015-06-17 80 views
0

我使用java SecureRandom創建salt來加密用戶。但是,當我嘗試將用戶與salt和密碼相匹配時,他們在不同的機器上失敗。用戶是在Linux測試機器上創建的,我將數據庫複製到我的OS X機器上。匹配成功的測試機上,但沒有在我的OS X.由Java SecureRandom創建的salt具有不同的getBytes()值

相同的鹽得到不同的字節用下面的代碼,甚至連長度都不同:

salt.getBytes()

enter image description here

enter image description here

這裏是鹽生成過程:

 SecureRandom random = new SecureRandom(); 
     byte bytes[] = new byte[20]; 
     random.nextBytes(bytes); 
     String salt = new String(bytes); 
     user.setSalt(salt); 

可能是getBytes()可能在同一個鹽在不同的機器上有不同的值?

回答

1

不要做:String salt = new String(bytes);

您正在將一系列字節到使用機器的默認編碼字符串。您應該將字節數組保存爲一個字節數組。

如果您存儲在數據庫中的數據,你可以將其存儲在一個二進制字符串列(BYTEA PostgreSQL中,例如 - 可能是在其他的DB BLOB)。

+0

我看,所以,如果我不想改變salt數據類型,我可以給一個字符集,比如'utf-8'作爲第二個參數'新的字符串(字節,'utf-8')解決方法? –

+0

@RyanZhu並非所有系列的字節都可以編碼成有效的UTF_8字符​​串,因此也不會起作用。你的salt不是一個字符串,所以沒有理由把它放在一個字符串中......試試這個例子:'byte [] b = {-128}; byte [] b2 = new String(b,UTF_8).getBytes(UTF_8); System.out.println(Arrays.toString(b2));' – assylias

+0

另請參見我剛剛發佈的重複問題和此:http://stackoverflow.com/questions/16853957/convert-byte-salt-to-string-in -java – assylias

1

根據String.getBytes()

的getBytes()將此String編碼使用 平臺默認的字符集的字節序列,並將結果存儲到一個新的字節數組。

因此,如果你在機器上有不同的字符集,結果將會不同。

+0

對,我在這裏看到問題.. –