0
SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
byte[] salt = new byte[16];
random.nextBytes(salt);

保存/読み取りのためにソルトを文字列に変換したいと思います。これを機能させることができないようです。適切なエンコーディングを使用する必要があることを読みましたが、どのエンコーディングを使用すればよいかわかりません。次のことを試しましたが、がらくたになります:

String s = new String(salt, "UTF-8");
String s = new String(salt, "UTF-16");
String s = new String(salt);

編集:コンテキストについては、このコードを理解しようとしています。私はソルトとパスワードを表示しようとしているので、コードをサルにすることができます。

4

2 に答える 2

7

Base64 (Apache Commons) クラスを使用するかsun.misc.BASE64Encoder/BASE64Decode、バイト配列をエンコードする必要があります。

于 2012-07-07T02:16:28.310 に答える
3

AVD が言うように、解決策は Base64 エンコーディングまたはその他のテキストとしてのバイナリ エンコーディングを使用することです。(たとえば、Hex エンコーディング。)

なんで?バイナリ データはテキストではないためです。

現在行っていることは、バイトが UTF-8 または UTF-16 または (最後のケースでは) プラットフォームのデフォルトのエンコーディングとして正しくエンコードされたテキストであることを String コンストラクターに伝えることです。これは明らかに誤りです。あなたが見ている「ジャンク」は、ランダムなバイナリをテキストとしてデコードしようとすると得られるものです。

さらに悪いことに、ランダムなバイナリ データに適用すると、デコード プロセスに損失が生じる可能性があります。たとえば、一部のバイト シーケンスは、UTF-8 として処理しようとすると単純に無効になります。(UTF-8 の仕様はそう言っています!) UTF-8 デコーダーがこれらの無効なシーケンスの 1 つを検出すると、それ'?'を「無効な文字」を意味する文字 (a など) に置き換えます。その後、文字列内の文字をバイトに戻すと、元のバイト シーケンスとは異なるバイト シーケンスが得られます。それはおそらくあなたのユースケースにとって災害です。

于 2012-07-07T03:53:30.940 に答える