我有一个电子邮件验证系统,可以发送加密链接供用户点击。我有一个用户告诉我它没有工作,我发现了一个非常奇怪的错误,我无法解释。
这是一个可以正常使用的本地网址
http://localhost/cypher.action?cypher=TphMFuv%2FwcsgLThnU5cWInJFaZPMHeDFFL%2FRRPbbV70%3D
这是无效的远程网址
http://remotehost/cypher.action?cypher=TphMFuv%2FwcsgLThnU5cWInJFaZPMHeDFFL%2FRRPbbV70%3D
我的应用程序在tomcat服务器上运行struts2,但我认为不重要。在远程请求中,变量cypher为null。我不明白为什么。它正在运行完全相同的代码
干杯
克里斯
更新
原来,糟糕的日志记录隐藏了真正的问题。问题是服务器上出现了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)
现在找出服务器上发生的原因,而不是本地
更新
这个人似乎有类似的问题 Exception: "Given final block not properly padded" in Linux, but it works in Windows
Linux上有哪些编码差异?
答案 0 :(得分:0)
两台机器上的密钥不同。您需要跟踪两台计算机上的密钥处理,以便确定生成差异的位置。始终检查字节到字节匹配;字符匹配可能具有欺骗性。例如,不同系统之间的行尾可能会有所不同。
首先检查传输后收到的内容完全发送的内容。然后在序列化键/参数的每个处理之后将字节转储放入日志中。在家用和离开机器上进行比较并进行比较。这将确定从“两台机器上的相同”到“机器之间的不同”发生变化的位置。这应该确定问题发生的方法或代码部分。在该段代码中重复字节转储,直到问题被隔离。同样,您需要在两台机器上进行转储,以便从家用机器中获得已知目标进行比较。
答案 1 :(得分:0)
在设置之前对加密密钥进行URL编码。这样可以避免添加额外的字符。