Javascript SJCL在Java下的Rhino中无法正常工作,而同一脚本的行为与示例PHP脚本中的预期相同
更新: 这很有效Javascript SJCL在Java下的Rhino中无法正常工作,而同一脚本的行为与示例PHP脚本中的预期相同,javascript,encryption,Javascript,Encryption,更新: 这很有效 public static void main(String[] args){ try { ScriptEngineManager mgr = new ScriptEngineManager(); List<ScriptEngineFactory> factories = mgr.getEngineFactories(); System.out.println("Available script engines:");
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();
}
}
请帮忙。我现在束手无策
我正在使用SJCL加密从浏览器发送的几个请求参数,并尝试在我的Java操作类(Struts框架)中使用Rhino在服务器上运行SJCL来解密这些参数。 我正在使用sjcl.js提供的
encrypt()
和decrypt()
函数,并为测试目的对密码/密钥进行硬编码。
脚本抛出一个错误,如javax.script.ScriptException:sun.org.mozilla.javascript.internal.EvaluatorException:URI序列格式错误。
在sjcl.js代码的这部分中:
sjcl.codec.utf8String={
fromBits:函数(a){
var b=“”,c=sjcl.bitArray.bitLength(a),d,e;
对于(d=0;d>>24);
E可能是离题了,但是:在大多数情况下,JavaScript加密库不是您想要的。因为大多数编码人员希望使用它来保护发送到服务器的数据。为此,您需要SSL。如果您希望用户加密服务器无法解密的内容,则像SJCL这样的JavaScript库是必要的!至少在没有用户的情况下是这样正在发送密码。我已运行纯Java代码进行解密(0.8及更高版本,未对adata进行评估)。它使用Jackson for JSON和Bouncy Castle for CCM模式解密运行。对替代答案感兴趣吗?@nfecher我们计划在下一版本的软件中使用SSL。目前,将用户名/密码与请求一起发送似乎不太好(即使它是一个内部托管的应用程序)所以,至少在请求到达java层之前,尝试对其进行一点模糊处理。@owlstead替代答案?我正在用java开发一个与SJCL兼容的库,因此如果您继续使用java,您可能不需要Rhino。请注意,我目前感觉不太好,因此可能需要等到我发布它时,我可能会删除一些未经测试的代码不知怎么的。
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();