代码之家  ›  专栏  ›  技术社区  ›  codea

用Hibernate 3和Struts 2实现Jasypt时出错

  •  0
  • codea  · 技术社区  · 14 年前

    我正试图用Jasypt和hibernate3在一个webapp中加密密码。我按照上面的指示做了 jasypt website .

    下面是我的hibernate映射:

    <hibernate-mapping package="webapp.entity">
    
      <typedef name="encrypted" class="org.jasypt.hibernate.type.EncryptedStringType">
        <param name="encryptorRegisteredName">strongHibernateStringEncryptor</param>
      </typedef>
    
      <class name="User" table="Users">
        <id name="name"
          column="name"
          type="string">
        </id>
    
        <property name="passwd"
          column="passwd"
          type="encrypted"
          not-null="true">
        </property>
    
      </class>
    
    </hibernate-mapping>
    

    现在,每次打开hibernate会话时,我都会注册加密程序:

    public void initHibSession() {
        HibernateUtil.buildSessionFactory();
        hib_session = HibernateUtil.getSessionFactory().getCurrentSession();
        if (hib_session != null && hib_session.isOpen()) {
            hib_session.close();
            hib_session = HibernateUtil.getSessionFactory().openSession();
        }
        hib_session.beginTransaction();
    
        StandardPBEStringEncryptor strongEncryptor = new StandardPBEStringEncryptor();
        strongEncryptor.setPassword("aStrongPassword");
        HibernatePBEEncryptorRegistry registry = HibernatePBEEncryptorRegistry.getInstance();
        registry.registerPBEStringEncryptor("strongHibernateStringEncryptor", strongEncryptor);
    }
    

    FreeMarker template error!
    
    Method public java.lang.String  org.apache.commons.lang.exception.NestableRuntimeException.getMessage(int) threw an       exception when invoked on org.jasypt.exceptions.EncryptionInitializationException: No string encryptor registered for hibernate with name "strongHibernateEncryptor"
    The problematic instruction:
    ----------
    ==&gt; ${msgs[0][0]} [on line 76, column 25 in org/apache/struts2/dispatcher/error.ftl]
    ----------
    
    Java backtrace for programmers:
    ----------
    freemarker.template.TemplateModelException: Method public java.lang.String  org.apache.commons.lang.exception.NestableRuntimeException.getMessage(int) threw an exception when invoked on org.jasypt.exceptions.EncryptionInitializationException: No string encryptor registered for hibernate with name "strongHibernateEncryptor"
    at freemarker.ext.beans.SimpleMethodModel.exec(SimpleMethodModel.java:130)
    at freemarker.ext.beans.SimpleMethodModel.get(SimpleMethodModel.java:138)
    at freemarker.core.DynamicKeyName.dealWithNumericalKey(DynamicKeyName.java:111)
    at freemarker.core.DynamicKeyName._getAsTemplateModel(DynamicKeyName.java:90)
    at freemarker.core.Expression.getAsTemplateModel(Expression.java:89)
    at freemarker.core.Expression.getStringValue(Expression.java:93)
    at freemarker.core.DollarVariable.accept(DollarVariable.java:76)
    at freemarker.core.Environment.visit(Environment.java:210)
    at freemarker.core.MixedContent.accept(MixedContent.java:92)
    at freemarker.core.Environment.visit(Environment.java:210)
    at freemarker.core.IfBlock.accept(IfBlock.java:82)
    at freemarker.core.Environment.visit(Environment.java:210)
    at freemarker.core.IfBlock.accept(IfBlock.java:82)
    at freemarker.core.Environment.visit(Environment.java:210)
    at freemarker.core.MixedContent.accept(MixedContent.java:92)
    at freemarker.core.Environment.visit(Environment.java:210)
    at freemarker.core.Environment.process(Environment.java:190)
    at freemarker.template.Template.process(Template.java:237)
    at org.apache.struts2.dispatcher.Dispatcher.sendError(Dispatcher.java:748)
    at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:505)
    at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
    at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
    at java.lang.Thread.run(Thread.java:636)
    Caused by: java.lang.NullPointerException
    at     freemarker.ext.beans.SimpleMemberModel.unwrapArguments(SimpleMemberModel.java:85)
    at freemarker.ext.beans.SimpleMethodModel.exec(SimpleMethodModel.java:106)
    ... 33 more
    

    有没有人想到用hibernate3和struts2实现jasypt,或者能帮我解决这个错误(我必须使用jasypt)

    2 回复  |  直到 14 年前
        1
  •  0
  •   codea    14 年前

    <param name="encryptorRegisteredName">strongHibernateEncryptor</param>
    

    registry.registerPBEStringEncryptor("strongHibernateStringEncryptor", strongEncryptor);
    

    也必须设置密码:

    strongEncryptor.setPassword("aStrongPassword");
    

    现在没有错误了。

    (我编辑上面的代码以反映更改)

        2
  •  0
  •   Will Sargent    14 年前

    您应该知道hibernate/jaspyt加密是基于PBE的并且是可逆的,这意味着它只在数据库中加密,而不是在应用程序中。

    StrongPasswordEncryptor