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

发布于 2024-09-10 18:57:38 字数 5180 浏览 5 评论 0原文

我正在尝试使用 Jasypt 和 hibernate 3 来加密 Web 应用程序中的密码。我按照 jasypt 网站上的说明进行操作

这是我的 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

任何人都有使用 Hibernate 3 和 Struts 2 实现 jasypt 的想法,或者可以帮我解决这个错误吗? (我必须使用jasypt)

I'm trying to encrypt passwords in a webapp using Jasypt with hibernate 3. I followed the instructions on the jasypt website.

Here's my hibernate mapping :

<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>

Now I register the encryptor each time I open a session with 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);
}

Then, each time I try to access a user, this exception is thrown :

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:
----------
==> ${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

Anybody have an idea for implementing jasypt with Hibernate 3 and Struts 2 or can help me with this error ? (I have to use jasypt)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

杯别 2024-09-17 18:57:38

没关系,问题是加密器在映射中注册的名称:

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

当我注册它时,我在名称中添加“字符串”:

registry.registerPBEStringEncryptor("strongHibernateStringEncryptor", strongEncryptor);

也必须设置密码:

strongEncryptor.setPassword("aStrongPassword");

现在不再有错误。

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

It's ok, the problem was the encryptor registered name in the mapping :

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

When I registered it, I add "String" in the name :

registry.registerPBEStringEncryptor("strongHibernateStringEncryptor", strongEncryptor);

Have to set a password too :

strongEncryptor.setPassword("aStrongPassword");

No more error now.

(I edit my code above to reflect the changes)

堇色安年 2024-09-17 18:57:38

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

特别是对于密码,最好使用基于摘要的不可逆加密 - StrongPasswordEncryptor 确实是您在上述情况下应该使用的。

You should be aware that the hibernate / jaspyt encryption is PBE based and reversible, meaning that it's only encrypted in the database, not in the app.

For passwords especially, it's better to use digest based encryption that is not reversible -- the StrongPasswordEncryptor is really what you should be using in the above case.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文