2

PlayFramework1.2.4のセッションで問題が発生しました。特定の文字列( "testDude5")のSHA256ハッシュをセッションに追加し、後でそれを取得すると、値が同じになりません。「testDude1」のような他の文字列では発生しません。結果を再現するためのサンプルコードを次に示します。

package controllers;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import play.mvc.Controller;


public class ExampleController extends Controller
{

    public static final String test1 = "testDude1";
    public static final String test2 = "testDude5";

    public static void set()
    {
        session.put("test1", getHash(test1));
        session.put("test2", getHash(test2));
    }

    public static void get()
    {
        String output = "";

        output += "Test 1 compare: ";
        output += session.get("test1").equals(getHash(test1)) ? "success" : "failed";
        output += "\n";

        output += "Test 2 compare: ";
        output += session.get("test2").equals(getHash(test2)) ? "success" : "failed";
        output += "\n";

        renderText(output);
    }

    /**
     * Generates the hash value for a password.
     * 
     * @param password
     * @return hash
     */
    public static String getHash(String password)
    {
        // Create an digest object
        MessageDigest md;

        try
        {
            // Try to get sha-265
            md = MessageDigest.getInstance("SHA-256");

            // Encrypt the password
            md.update(password.getBytes("UTF-8"));

            // Get the encrypted password
            byte[] digest = md.digest();

            // Convert byte array to String
            String str = new String(digest);

            // Return encrypted password
            return str;
        }
        catch (NoSuchAlgorithmException e)
        {
            e.printStackTrace();
        }
        catch (UnsupportedEncodingException e)
        {
            e.printStackTrace();
        }

        return null;
    }

}

私はこれに完全に戸惑っています。誰かがそこで何が起こっているのか考えていますか?アドバイスありがとうございます。

乾杯

4

1 に答える 1

3

問題はgetHash関数にあります。PlayFrameworkセッションに問題はありません。

public static String getHash(String password) {
    ....
    // Get the encrypted password
    byte[] digest = md.digest();
    // Convert byte array to String
    String str = new String(digest); // DON'T do this with digest! 
    // The behavior is unspecified.

Java APIのドキュメントによると、このコンストラクターは「プラットフォームのデフォルトの文字セットを使用して、指定されたバイト配列をデコードすることで新しい文字列を構築します。..指定されたバイトがデフォルトの文字セットで無効な場合のこのコンストラクターの動作は指定されていません」。ただし、ハッシュダイジェストにデフォルトの文字セットで無効なものが含まれている可能性があります。

Play Frameworkは、byte[]のダイジェストを16進文字列に変換するための優れたユーティリティ関数Codec.byteToHeString()を提供します。これはまさにあなたが必要とするものかもしれません。

    // Codec resides in play.libs
    String str = Codec.byteToHexString(digest);
于 2012-12-13T03:42:22.747 に答える