SJCL не работает правильно в Rhino под Java, в то время как тот же скрипт ведет себя, как и ожидалось в примере PHP - PullRequest
1 голос
/ 02 марта 2012

Обновление: это работает

public static void main(String[] args){
try {
        ScriptEngineManager mgr = new ScriptEngineManager();
        List<ScriptEngineFactory> factories = mgr.getEngineFactories();
        System.out.println("Available script engines:");
        for (int i = 0; i < factories.size(); i++) {
            ScriptEngineFactory factory = factories.get(i);

            String engine = factory.getEngineName();
            String language = factory.getLanguageName();

            System.out.println("-------------------------------------------");
            System.out.println("Language: " + language);
            System.out.println("Engine: " + engine);
            System.out.println("-------------------------------------------");
        }
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("ECMAScript");
        File script_file = new File("web/js/sjcl.js");
        Reader reader = new FileReader(script_file);
        engine.eval(reader);
        String script = "function decode(encoded_value){"
                + "var decoded_value = sjcl.decrypt('asdf',encoded_value);"
                + "return decoded_value;}"
                + "function encode(plain_text){"
                + "var encoded_value = sjcl.encrypt('asdf', plain_text);"
                + "return encoded_value;}";
        engine.eval(script);
        Invocable invocableEngine = (Invocable) engine;

        String plain_text = "admin";
        String cypher_text = (String) invocableEngine.invokeFunction("encode", plain_text);
        String plain_text_return = (String)invocableEngine.invokeFunction("decode", cypher_text);
        System.out.print("plain_text="+plain_text+"\ncypher_text=" +cypher_text + "\nplain_text_return=" + plain_text_return+"\n");
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Когда я использую request.getParameter() для получения зашифрованного значения от клиента (браузера), я не получаю ожидаемый результат (пароль декодируется как нежелательная):

ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("ECMAScript");
        String filePath = getServlet().getServletContext().getRealPath("/") + "js/sjcl.js";
        File script_file = new File(filePath);
        Reader reader = new FileReader(script_file);
        engine.eval(reader);
        String script = "function decode(encoded_value){"
                + "var decoded_value = sjcl.decrypt('asdf',encoded_value);"
                + "return decoded_value;}";
        engine.eval(script);
        Invocable invocableEngine = (Invocable) engine;
        String encoded_un = (String) request.getParameter("pass");
        String un = (String) invocableEngine.invokeFunction("decode", encoded_un).toString();

Пожалуйста, помогите.Теперь я в замешательстве.


Я использую SJCL для шифрования нескольких параметров запроса, отправленных из браузера, и пытаюсь расшифровать их в своем классе действий Java (инфраструктура Struts), запустив SJCL насервер, использующий Rhino.Я использую функции encrypt() и decrypt(), предоставляемые sjcl.js, и жестко кодирую пароль / ключ для целей тестирования.Сценарий выдает ошибку типа javax.script.ScriptException: sun.org.mozilla.javascript.internal.EvaluatorException: Malformed URI sequence. в этой части кода sjcl.js: sjcl.codec.utf8String={ fromBits:function(a){ var b="",c=sjcl.bitArray.bitLength(a),d,e; for(d=0;d<c/8;d++){ if((d&3)===0)e=a[d/4]; b+=String.fromCharCode(e>>>24); e<<=8 } return decodeURIComponent(encodeURI(escape(b))) },

Когда я изменяю функцию escape на encodeURI, сценарии запускаются без ошибок, кроме декодированного значенияэто неверно.Я протестировал то же самое с простым приложением PHP, и он показывает ожидаемые результаты.

Любая помощь будет потрясающей:)

PS: я не против попробовать другие библиотеки шифрования javascript.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...