0

我有一个电子邮件验证系统,它发送一个加密链接供用户点击。我有一个用户告诉我它不起作用,我发现了一个非常奇怪的错误,我无法解释。

这是一个可以正常工作的本地 URL

http://localhost/cypher.action?cypher=TphMFuv%2FwcsgLThnU5cWInJFaZPMHeDFFL%2FRRPbbV70%3D

这是不起作用的远程 URL

http://remotehost/cypher.action?cypher=TphMFuv%2FwcsgLThnU5cWInJFaZPMHeDFFL%2FRRPbbV70%3D

我的应用程序在 tomcat 服务器上运行 struts2,但我认为这并不重要。在远程请求中,变量 cypher 为空。我不明白为什么。它运行完全相同的代码

干杯

克里斯

更新

事实证明,糟糕的日志记录隐藏了真正的问题。问题是在服务器上它得到一个 BadPaddingException

javax.crypto.BadPaddingException: Given final block not properly padded
at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
at com.sun.crypto.provider.DESCipher.engineDoFinal(DashoA13*..)
at javax.crypto.Cipher.doFinal(DashoA13*..)
at service.DesEncrypterService.decrypt(DesEncrypterService.java:80)
at action.LoginAction.cypherLogin(LoginAction.java:93)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

现在找出为什么在服务器上而不是在本地发生这种情况

更新

似乎这是一个类似的问题,因为这个人 在 Linux 中遇到了 Exception: "Given final block not proper padded",但它在 Windows 中有效

Linux上的一些编码差异?

4

2 回答 2

0

在设置之前对加密密钥进行 URL 编码。这将避免添加额外的字符。

于 2012-09-28T04:25:26.143 回答
0

你的钥匙在两台机器上是不同的。您需要跟踪两台机器上的关键处理,以便查明产生差异的位置。始终检查字节到字节的匹配;字符匹配可能具有欺骗性。例如,不同系统之间的生产线末端可能存在无形的差异。

首先检查传输后收到的内容是否与发送的内容完全相同。然后在对序列化的键/参数进行每次处理后将字节转储放入日志中。在主场和客场机器上执行此操作并进行比较。这将确定从“两台机器相同”到“机器之间不同”的变化发生在哪里。这应该查明问题发生的方法或代码部分。重复那段代码中的字节转储,直到问题被隔离。同样,您将需要在两台机器上进行转储,以便您有一个来自家用机器的已知目标来进行比较。

于 2012-09-24T12:08:42.740 回答