2012-07-09 63 views
0

我是Oracle和JSP的新手。作为我的任务的一部分,我尝试在JSP中创建一个登录页面。所以我已将它连接到数据库,并且我拥有所有用户名和密码。但passowrd是加密格式..我的主管告诉我,它在dbms_obfuscation_toolkit.DESEncrypt中加密......我必须将该密码解密为原始,以便我可以在登录页面上使用提供的密码对其进行检查..我在JSP中使用此代码:JSP代码解密dbms_obfuscation_toolkit.DESEncrypt oracle

<%@ page import="java.sql.*" %> 
<%@ page import="java.security.*" %> 
<%@ page import="javax.crypto.*" %> 
<%@ page import="javax.crypto.spec.*" %> 

<HTML> 
<HEAD> 
<TITLE>Simple JSP/Oracle Query Example</TITLE> 
</HEAD> 
<BODY> 

<% 
    Class.forName("oracle.jdbc.OracleDriver"); 

    Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@xxx:xxxx:xxxx","ixxxer","ixxxer"); 
         // @//machineName:port:SID, userid, password 

    Statement st=conn.createStatement(); 

    ResultSet rs=st.executeQuery("Select * from Cusxxxxer"); 

    while(rs.next()){ 
     String name=rs.getString("user_id"); 
     String p=rs.getString("password"); 
     out.println(name+":"+p); 
     out.println("</br>"); 


    String algorithm1 = "DES";//magical mystery constant 
    String algorithm2 = "DES/CBC/NoPadding";//magical mystery constant 
    IvParameterSpec iv = new IvParameterSpec(new byte [] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 });//magical mystery constant 
    Cipher cipher; 
    SecretKey key; 
    String k="12345abc"; 
    key = new SecretKeySpec(k.getBytes(), algorithm1); 
    cipher = Cipher.getInstance(algorithm2); 

    String str="test1234abc"; 

    cipher.init(Cipher.ENCRYPT_MODE, key, iv); //normally you could leave out the IvParameterSpec argument, but not with Oracle 

    byte[] bytes=str.getBytes("UTF-8"); 

    byte[] encrypted = cipher.doFinal(bytes); 

    } 
%> 
</BODY> 
</HTML> 

我有最后一行where语句是问题:byte[] encrypted = cipher.doFinal(bytes);这种说法给我一个错误:

javax.crypto.IllegalBlockSizeException:输入长度不是多个在的com.sun 8个字节。 crypto.provider.SunJCE_h.a(DashoA6275)at com.sun.crypto.provider.SunJCE_h.b(DashoA6275)at com.sun.crypto.provider.SunJCE_h.b(DashoA6275)at com.sun.crypto.provider.DESCipher .engineDoFinal(DashoA6275)在com.orionserver上的_check1._jspService上的javax.crypto.Cipher.doFinal(DashoA6275)(_check1.java:83)[com.orionserver上的SRC:/check1.jsp:45] [Oracle Application Server Containers for J2EE 10g(10.1.2.0.2) ] .http.OrionHttpJspPage.service(OrionHttpJspPage.java:56)at oracle.jsp.runtimev2.JspPageTable.service(JspPageTable.java:350)at oracle.jsp.runtimev2.JspServlet.internalService(JspServlet.java:509)at oracle .jsp.runtimev2.JspServlet.service(JspServlet.java:413)at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)at com.evermind [Oracle Application Server Containers for J2EE 10g(10.1.2.0.2) )]。server.http.ServletRequestDispatcher.invoke(ServletRequestDispatcher.java:824)at com.evermind [Oracle Application Server Containers for J2EE 10g(10.1.2.0.2)]。server.http.ServletRequestDispatcher.forwardInternal(ServletRequestDispatcher.java: 330)at com.evermind [Oracle Application Server Containers for J2EE 10g(10.1.2.0.2)]。server.http.HttpRequestHandler.processRequest(HttpRequestHandler.java:830)at com.eve rmind [适用于J2EE的Oracle应用服务器容器10g(10.1.2.0.2)]。server.http.HttpRequestHandler.run(HttpRequestHandler.java:285)at com.evermind [适用于J2EE的Oracle应用服务器容器10g(10.1.2.0.2) )]。server.http.HttpRequestHandler.run(HttpRequestHandler.java:126)at com.evermind [Oracle Application Server Containers for J2EE 10g(10.1.2.0.2)]。util.ReleasableResourcePooledExecutor $ MyWorker.run(ReleasableResourcePooledExecutor.java: 186)在java.lang.Thread.run(Thread.java:534)

我知道错误意味着参数需要8个字节的倍数。但我应该怎么做?请任何人都可以纠正我的代码或给我一些其他的例子。我是JSP和ORACLE的新手,所以都不太了解。提前致谢! :)

+0

您需要更多信息。您指出的Oracle方法不适用任何填充,并且适用于各种加密/解密模式,例如, DES和三重DES(或正式的TDEA)。它似乎执行CBC模式,但我不知道你应该从哪里检索IV。向你的主管询问更多信息。 – 2012-07-09 12:12:18

回答

1

请更换

String str="test1234abc"; 

String str="12345abc"; 
0

好吧,我得到了答案,我的查询...... psaraj12提到的同样的事情。但只是为了向所有人清楚它背后的原因,我正在使用8字节加密。所以密码必须是8个字符的倍数。因此,通过在登录页面上检查密码必须是8个字符的倍数来解决问题。

+1

有关dbms_obfuscation_toolkit的oracle文档中提及此限制http://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_obtool.htm – psaraj12 2012-07-10 05:22:11

+0

是的,thankyou psaraj – Murtaza 2012-07-10 05:36:00