Session 播放框架会话返回错误的sha256值

Session 播放框架会话返回错误的sha256值,session,playframework,Session,Playframework,我对play framework 1.2.4中的会话有问题。当我向会话中添加特定字符串的SHA256哈希(“testDude5”)并随后检索它时,值是不同的。其他字符串如“testDude1”不会出现这种情况。下面是重现结果的示例代码 package controllers; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAl

我对play framework 1.2.4中的会话有问题。当我向会话中添加特定字符串的SHA256哈希(“testDude5”)并随后检索它时,值是不同的。其他字符串如“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;
    }

}
我对此完全感到困惑。有人知道那里发生了什么吗。谢谢你的建议


干杯

问题出在getHash函数中。play框架会话没有任何问题

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提供了一个很好的实用函数Codec.byteToHeString(),用于将字节[]中的摘要转换为十六进制字符串。这可能正是你需要的

    // Codec resides in play.libs
    String str = Codec.byteToHexString(digest);

嘿,非常感谢你的回复。这确实解决了问题,并产生了所需的十六进制字符串,而播放没有问题。但我仍然想知道为什么play不能处理其他字符串。SHA256摘要的字节数组可能包含一些不适合在字符串中“直接表示”的字节(例如换行或回车,这两个在HTTP协议的头中有含义)。这就是为什么十六进制字符串是“表示”SHA256摘要的字节数组的更好方法。Base64编码也是另一个不错的选择。