通過註冊時候的郵箱找回密碼是一種比較可靠的方式,這兒指的找回密碼是修改密碼的另一種說法,在服務器上的數據庫中密碼保存的方式通常是通過MD5加密過的,不能反譯密碼得到原始密碼,所以只有通過重新修改密碼來獲取密碼,update方法來更新密碼,通常我們需要在數據庫中能唯一確定要修改的用戶,通過郵箱地址唯一來確定唯一的用戶。
我們假如要修改密碼的郵箱是
String EmailAddress = "[email protected]";
然後加密這個郵箱地址,不能通過人工識別的方式能夠確定郵箱地址,加密方式如下:
private String encrypt(String name){
String str = name + ":||:" + System.currentTimeMillis();
String md5 = MD5Support.MD5(str + Constant.getMd5key());
String result = null;
try {
result = Base64Support.toUrlStr((str + ":||:" + md5).getBytes("UTF-8"));
}
catch (UnsupportedEncodingException e){
e.printStackTrace();
}
return result;
}
通過上面加密後的數據就不容易被人工破解了,例如下面是我的郵箱加密後的字符串
dHNhb3dlQGdtYWlsLmNvbTp8fDoxMjkxODU5NzgxMzkwOnx8OjM3ZDY4ODM3YTcwOGM3NTc0N2YxMjA0N2Q5ZTAxOTk0
這樣就能保證用戶不會通過自己在瀏覽器輸入地址而修改不是自己賬戶的密碼
然後得到這個加密的字符串後,將組合好的一個訪問地址利用 java的mailsender發送到郵箱
當用戶訪問的時候,將先前的修改密碼標誌關閉,這樣再次訪問這個地址的時候是無效的,這兒就有翻譯剛纔我們加密的字符串,方法如下
假設p是加密後的字符串,下面的方法是判斷字符串是否合法,合法返回true,否則返回false
boolean checkParam() {
if (p == null)
return false;
String pStr = "";
try {
pStr = new String(Base64Support.fromUrlStr(p), "UTF-8");
}
catch (Exception e) {
e.printStackTrace();
}
String[] arr = pStr.split(":\\|\\|:");
return arr.length == 3 && (System.currentTimeMillis() - Long.parseLong(arr[1])) <= (60L * 1000 * 60 * 24 * 2) && MD5Support.MD5(arr[0] + ":||:" + arr[1] + Constant.getMd5key()).equals(arr[2]);
}
如果通過檢驗以後我們就可以得到當初加密的郵箱地址,然後根據郵箱地址來改變密碼 String getNameFromP(String p) {
String pStr = "";
try {
pStr = new String(Base64Support.fromUrlStr(p), "UTF-8");
}
catch (Exception e) {
e.printStackTrace();
}
return pStr.split(":\\|\\|:")[0];
}
這樣就可以成功的修改密碼了