2012-09-21 171 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

在設置密鑰之前,先對密碼密鑰進行網址編碼。這將避免添加額外的字符。