2012-09-21 174 views
0

我有一个电子邮件验证系统,发送加密链接供用户点击。我有一个用户告诉我这是行不通的,我发现了一个很奇怪的错误,我无法解释。URL中破解的密码破解

这是正常工作

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

这是不起作用在Tomcat服务器上

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

我的应用程序运行时Struts2的远程URL的本地URL,但我不知道认为重要。在远程请求上,变量密码为空。我不明白为什么。它的运行完全相同的代码

干杯

克里斯

UPDATE

原来那么糟记录藏身的现实问题。问题是,在服务器上它得到一个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) 

我们发现这是为什么发生在服务器上,而不是本地

UPDATE

看来,这是一个类似的问题,这个人有 Exception: "Given final block not properly padded" in Linux, but it works in Windows

Linux上的一些编码区别?

+0

您的'remotehost'地址是否真的指向服务器? – bdares

+0

是的,它直接到我的Tomcat服务器。它适用于绝大多数密码。问题在于什么时候有特殊字符。如9TOfCNEeycQM3tAsIyRtox8fAlLNYu + o编码为TOfCNEeycQM3tAsIyRtox8fAlLNYu%2Bo,由于+也不起作用。我不明白为什么它在本地工作,但变量密码在远程计算机上为空 – Kris

+0

这是另一个发送时返回null的示例g6EIaeFZHmUWTBqUUzeADQeZGcDaeWms。我通过删除一些字符来玩一点。这工作g6EIaeFZHmUWTBqUUzeADQeZGcDae,但这是返回为空g6EIaeFZHmUWTBqUUzeADQeZGcDaeW。为什么会出现'W'效应呢? – Kris

回答

0

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

首先检查发送后接收到的是究竟是发送了什么。然后在序列化键/参数的每个处理之后,将字节转储放入日志中。在主机和离机器上进行此操作并进行比较。这将确定变化发生的位置从“两台机器相同”到“机器间不同”。这应该确定问题发生的方法或代码部分。重复这段代码中的字节转储,直到将问题隔离。同样,你将需要在两台机器上转储,以便你有一台来自家用机器的已知目标进行比较。

+0

思考它是否有关键不同?服务器是发送带有加密链接的电子邮件的机器,它是接收解密链接请求的服务器,因此它始终使用相同的密钥。所以难道不好吗?或者是因为密钥被搞砸了,我应该在服务器上生成一个新密钥 – Kris

0

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