導航:首頁 > 編程語言 > javatokenmd5

javatokenmd5

發布時間:2023-02-04 15:07:37

java怎麼去判斷md5加密的密碼

JDK裡面有一個java.security.MessageDigest類,這個類就是用來加密的。
String token = System.currentTimeMillis()+new Random().nextInt()+"";<img id="selectsearch-icon" src="https://gss0.bdstatic.com/70cFsjip0QIZ8tyhnq/img/iknow/qb/select-search.png" alt="搜索" class="selectsearch-hide">
try {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] md5 = md.digest(token.getBytes());
} catch (Exception e) {
throw new RuntimeException(e);
}

⑵ javaweb防止表單重復提交的幾種解決方案

1.js方法解決:關於js方法解決就是說通過js動態控制提交按鈕不能多次點擊,或者多次點擊不起作用。

方案一:通過設立標識使表單不能重復提交:

要強調的是,利用session方法解決表單重復問題是十分完美的,基本上可以應對各種重復提交問題。

但!是不是之前在客戶端防止表單重復提交的種種方法就不使用了呢?

答案是否定的,我們需要多種方法混合使用才能達到最好的效果,也許有人會問,不是說session方法基本可以應對各種重復提交問題了嗎?

這里我們所說的達到最好效果指的是,給用戶更好地體驗,例如用戶點擊了提交按鈕,這時將按鈕變為不可用的,用以告訴用戶你已經提交內容了,不可重復提交。還有如果無論什麼情況都用session防止表單重復提交問題,反而無形的增加了伺服器端的負擔。

⑶ 怎麼用java調用微信支付介面

java調用微信支付介面方法:
RequestHandler requestHandler = new RequestHandler(super.getRequest(),super.getResponse());

//獲取 //兩小時內有效,兩小時後重新獲取

Token = requestHandler.GetToken();

//更新token 到應用中

requestHandler.getTokenReal();

System.out.println("微信支付獲取token=======================:" +Token);

//requestHandler 初始化

requestHandler.init();

requestHandler.init(appid,appsecret, appkey,partnerkey, key);

// --------------------------------本地系統生成訂單-------------------------------------

// 設置package訂單參數

SortedMap<String, String> packageParams = new TreeMap<String, String>();

packageParams.put("bank_type", "WX"); // 支付類型

packageParams.put("body", "xxxx"); // 商品描述

packageParams.put("fee_type", "1"); // 銀行幣種

packageParams.put("input_charset", "UTF-8"); // 字元集

packageParams.put("notify_url", "http://xxxx.com/xxxx/wxcallback"); // 通知地址 這里的通知地址使用外網地址測試,注意80埠是否打開。

packageParams.put("out_trade_no", no); // 商戶訂單號

packageParams.put("partner", partenerid); // 設置商戶號

packageParams.put("spbill_create_ip", super.getRequest().getRemoteHost()); // 訂單生成的機器IP,指用戶瀏覽器端IP

packageParams.put("total_fee", String.valueOf(rstotal)); // 商品總金額,以分為單位

// 設置支付參數

SortedMap<String, String> signParams = new TreeMap<String, String>();

signParams.put("appid", appid);

signParams.put("noncestr", noncestr);

signParams.put("traceid", PropertiesUtils.getOrderNO());

signParams.put("timestamp", timestamp);

signParams.put("package", packageValue);

signParams.put("appkey", this.appkey);

// 生成支付簽名,要採用URLENCODER的原始值進行SHA1演算法!

String sign ="";

try {

sign = Sha1Util.createSHA1Sign(signParams);

} catch (Exception e) {

e.printStackTrace();

}

// 增加非參與簽名的額外參數

signParams.put("sign_method", "sha1");

signParams.put("app_signature", sign);

// api支付拼包結束------------------------------------

//獲取prepayid

String prepayid = requestHandler.sendPrepay(signParams);

System.out.println("prepayid :" + prepayid);

// --------------------------------生成完成---------------------------------------------

//生成預付快訂單完成,返回給android,ios 掉起微信所需要的參數。

SortedMap<String, String> payParams = new TreeMap<String, String>();

payParams.put("appid", appid);

payParams.put("noncestr", noncestr);

payParams.put("package", "Sign=WXPay");

payParams.put("partnerid", partenerid);

payParams.put("prepayid", prepayid);

payParams.put("appkey", this.appkey);

//這里除1000 是因為參數長度限制。

int time = (int) (System.currentTimeMillis() / 1000);

payParams.put("timestamp",String.valueOf(time));

System.out.println("timestamp:" + time);

//簽名

String paysign ="";

try {

paysign = Sha1Util.createSHA1Sign(payParams);

} catch (Exception e) {

e.printStackTrace();

}

payParams.put("sign", paysign);

//拼json 數據返回給客戶端

BasicDBObject backObject = new BasicDBObject();

backObject.put("appid", appid);

backObject.put("noncestr", payParams.get("noncestr"));

backObject.put("package", "Sign=WXPay");

backObject.put("partnerid", payParams.get("partnerid"));

backObject.put("prepayid", payParams.get("prepayid"));

backObject.put("appkey", this.appkey);

backObject.put("timestamp",payParams.get("timestamp"));

backObject.put("sign",payParams.get("sign"));

String backstr = dataObject.toString();

System.out.println("backstr:" + backstr);

return backstr;

====================到此為止,預付款訂單已生成,並且已返回客戶端====================

//坐等微信伺服器通知,通知的地址就是生成預付款訂單的notify_url

ResponseHandler resHandler = new ResponseHandler(request, response);

resHandler.setKey(partnerkey);

//創建請求對象

//RequestHandler queryReq = new RequestHandler(request, response);

//queryReq.init();

if (resHandler.isTenpaySign() == true) {

//商戶訂單號

String out_trade_no = resHandler.getParameter("out_trade_no");

System.out.println("out_trade_no:" + out_trade_no);

//財付通訂單號

String transaction_id = resHandler.getParameter("transaction_id");

System.out.println("transaction_id:" + transaction_id);

//金額,以分為單位

String total_fee = resHandler.getParameter("total_fee");

//如果有使用折扣券,discount有值,total_fee+discount=原請求的total_fee

String discount = resHandler.getParameter("discount");

//支付結果

String trade_state = resHandler.getParameter("trade_state");

//判斷簽名及結果

if ("0".equals(trade_state)) {

//------------------------------

//即時到賬處理業務開始

//------------------------------

System.out.println("----------------業務邏輯執行-----------------");

//——請根據您的業務邏輯來編寫程序(以上代碼僅作參考)——

System.out.println("----------------業務邏輯執行完畢-----------------");

System.out.println("success"); // 請不要修改或刪除

System.out.println("即時到賬支付成功");

//給財付通系統發送成功信息,財付通系統收到此結果後不再進行後續通知

resHandler.sendToCFT("success");

//給微信伺服器返回success 否則30分鍾通知8次

return "success";

}else{

System.out.println("通知簽名驗證失敗");

resHandler.sendToCFT("fail");

response.setCharacterEncoding("utf-8");

}

}else {

System.out.println("fail -Md5 failed");

⑷ java 中如何進行md5加密

JDK裡面有一個java.security.MessageDigest類,這個類就是用來加密的。

Stringtoken=System.currentTimeMillis()+newRandom().nextInt()+"";<img id="selectsearch-icon"src="https://gss0.bdstatic.com/70cFsjip0QIZ8tyhnq/img/iknow/qb/select-search.png"alt="搜索"class="selectsearch-hide">

try{

MessageDigestmd=MessageDigest.getInstance("MD5");

byte[]md5=md.digest(token.getBytes());

}catch(Exceptione){

thrownewRuntimeException(e);

}

⑸ 密碼那些事

之前在工作中經常用密鑰,但是不知道其中的原因,現在閑下來就來看下,再看的過程發現這個隨機數概念很模糊,於是就查了下,現總結如下:

0x01 隨機數

概述

隨機數在計算機應用中使用的比較廣泛,最為熟知的便是在密碼學中的應用。本文主要是講解隨機數使用導致的一些Web安全風。

我們先簡單了解一下隨機數

分類

隨機數分為真隨機數和偽隨機數,我們程序使用的基本都是偽隨機數,其中偽隨機又分為強偽隨機數和弱偽隨機數。

真隨機數,通過物理實驗得出,比如擲錢幣、骰子、轉輪、使用電子元件的噪音、核裂變等

偽隨機數,通過一定演算法和種子得出。軟體實現的是偽隨機數

強偽隨機數,難以預測的隨機數

弱偽隨機數,易於預測的隨機數

特性

隨機數有3個特性,具體如下:

隨機性:不存在統計學偏差,是完全雜亂的數列

不可預測性:不能從過去的數列推測出下一個出現的數

不可重現性:除非將數列本身保存下來,否則不能重現相同的數列

隨機數的特性和隨機數的分類有一定的關系,比如,弱偽隨機數只需要滿足隨機性即可,而強位隨機數需要滿足隨機性和不可預測性,真隨機數則需要同時滿足3個特性。

引發安全問題的關鍵點在於不可預測性。

偽隨機數的生成

我們平常軟體和應用實現的都是偽隨機數,所以本文的重點也就是偽隨機數。

偽隨機數的生成實現一般是演算法+種子。

具體的偽隨機數生成器PRNG一般有:

線性同餘法

單向散列函數法

密碼法

ANSI X9.17

比較常用的一般是線性同餘法,比如我們熟知的C語言的rand庫和Java的java.util.Random類,都採用了線性同餘法生成隨機數。

應用場景

隨機數的應用場景比較廣泛,以下是隨機數常見的應用場景:

驗證碼生成

抽獎活動

UUID生成

SessionID生成

Token生成

CSRF Token

找回密碼Token

游 戲 (隨機元素的生成)

洗牌

俄羅斯方塊出現特定形狀的序列

游戲爆裝備

密碼應用場景

生成密鑰:對稱密碼,消息認證

生成密鑰對:公鑰密碼,數字簽名

生成IV: 用於分組密碼的CBC,CFB和OFB模式

生成nonce: 用於防禦重放攻擊; 分組密碼的CTR模式

生成鹽:用於基於口令的密碼PBE等

0x02 隨機數的安全性

相比其他密碼技術,隨機數很少受到關注,但隨機數在密碼技術和計算機應用中是非常重要的,不正確的使用隨機數會導致一系列的安全問題。

隨機數的安全風險

隨機數導致的安全問題一般有兩種

應該使用隨機數,開發者並沒有使用隨機數;

應該使用強偽隨機數,開發者使用了弱偽隨機數。

第一種情況,簡單來講,就是我們需要一個隨機數,但是開發者沒有使用隨機數,而是指定了一個常量。當然,很多人會義憤填膺的說,sb才會不用隨機數。但是,請不要忽略我朝還是有很多的。主要有兩個場景:

開發者缺乏基礎常識不知道要用隨機數;

一些應用場景和框架,介面文檔不完善或者開發者沒有仔細閱讀等原因。

比如找回密碼的token,需要一個偽隨機數,很多業務直接根據用戶名生成token;

比如OAuth2.0中需要第三方傳遞一個state參數作為CSRF Token防止CSRF攻擊,很多開發者根本不使用這個參數,或者是傳入一個固定的值。由於認證方無法對這個值進行業務層面有效性的校驗,導致了 OAuth 的CSRF攻擊。

第二種情況,主要區別就在於偽隨機數的強弱了,大部分(所有?)語言的API文檔中的基礎庫(常用庫)中的random庫都是弱偽隨機,很多開發自然就直接使用。但是,最重要也最致命的是,弱偽隨機數是不能用於密碼技術的。

還是第一種情況中的找回密碼場景,關於token的生成, 很多開發使用了時間戳作為隨機數(md5(時間戳),md5(時間戳+用戶名)),但是由於時間戳是可以預測的,很容易就被猜解。不可預測性是區分弱偽隨機數和強偽隨機數的關鍵指標。

當然,除了以上兩種情況,還有一些比較特別的情況,通常情況下比較少見,但是也不排除:

種子的泄露,演算法很多時候是公開的,如果種子泄露了,相當於隨機數已經泄露了;

隨機數池不足。這個嚴格來說也屬於弱偽隨機數,因為隨機數池不足其實也導致了隨機數是可預測的,攻擊者可以直接暴力破解。

漏洞實例

wooyun上有很多漏洞,還蠻有意思的,都是和隨機數有關的。

1.應該使用隨機數而未使用隨機數

Oauth2.0的這個問題特別經典,除了wooyun實例列出來的,其實很多廠商都有這個問題。

Oauth2.0中state參數要求第三方應用的開發者傳入一個CSRF Token(隨機數),如果沒有傳入或者傳入的不是隨機數,會導致CSRF登陸任意帳號:

唯品會賬號相關漏洞可通過csrf登錄任意賬號

人人網 - 網路 OAuth 2.0 redirect_uir CSRF 漏洞

2.使用弱偽隨機數

1) 密碼取回

很多密碼找回的場景,會發 送給 用戶郵件一個url,中間包含一個token,這個token如果猜測,那麼就可以找回其他用戶的密碼。

1. Shopex  4.8.5密碼取回處新生成密碼可預測漏洞

直接使用了時間函數microtime()作為隨機數,然後獲取MD5的前6位。

1. substr(md5(print_r(microtime(),true)),0,6);

PHP 中microtime()的值除了當前 伺服器 的秒數外,還有微秒數,微妙數的變化范圍在0.000000 -- 0.999999 之間,一般來說,伺服器的時間可以通過HTTP返回頭的DATE欄位來獲取,因此我們只需要遍歷這1000000可能值即可。但我們要使用暴力破解的方式發起1000000次請求的話,網路請求數也會非常之大。可是shopex非常貼心的在生成密碼前再次將microtime() 輸出了一次:

1. $messenger = &$this->system->loadModel('system/messenger');echo microtime()."

";

2.奇虎360任意用戶密碼修改

直接是MD5( unix 時間戳)

3.塗鴉王國弱隨機數導致任意用戶劫持漏洞,附測試POC

關於找回密碼隨機數的問題強烈建議大家參考拓哥的11年的文章《利用系統時間可預測破解java隨機數| 空虛浪子心的靈魂》

2) 其他隨機數驗證場景

CmsEasy最新版暴力注入(加解密缺陷/繞過防注入)

弱偽隨機數被繞過

Espcms v5.6 暴力注入

Espcms中一處SQL注入漏洞的利用,利用時發現espcms對傳值有加密並且隨機key,但是這是一個隨機數池固定的弱偽隨機數,可以被攻擊者遍歷繞過

Destoon B2B  2014-05-21最新版繞過全局防禦暴力注入(官方Demo可重現)

使用了microtime()作為隨機數,可以被預測暴力破解

Android  4.4之前版本的Java加密架構(JCA)中使用的Apache Harmony 6.0M3及其之前版本的SecureRandom實現存在安全漏洞,具體位於classlib/moles/security/src/main/java/common/org/apache/harmony/security/provider/crypto/SHA1PRNG_SecureRandomImpl.java

類的engineNextBytes函數里,當用戶沒有提供用於產生隨機數的種子時,程序不能正確調整偏移量,導致PRNG生成隨機序列的過程可被預測。

Android SecureRandom漏洞詳解

安全建議

上面講的隨機數基礎和漏洞實例更偏重是給攻擊者一些思路,這里更多的是一些防禦和預防的建議。

業務場景需要使用隨機數,一定要使用隨機數,比如Token的生成;

隨機數要足夠長,避免暴力破解;

保證不同用處的隨機數使用不同的種子

對安全性要求高的隨機數(如密碼技術相關)禁止使用的弱偽隨機數:

不要使用時間函數作為隨機數(很多程序員喜歡用時間戳) Java:system.currenttimemillis() php:microtime()

不要使用弱偽隨機數生成器 Java: java.util.Random PHP: rand() 范圍很小,32767 PHP: mt_rand() 存在缺陷

強偽隨機數CSPRNG(安全可靠的偽隨機數生成器(Cryptographically Secure  Pseudo-Random Number Generator)的各種參考

6.強偽隨機數生成(不建議開發自己實現)

產生高強度的隨機數,有兩個重要的因素:種子和演算法。演算法是可以有很多的,通常如何選擇種子是非常關鍵的因素。 如Random,它的種子是System.currentTimeMillis(),所以它的隨機數都是可預測的, 是弱偽隨機數。

強偽隨機數的生成思路:收集計算機的各種,鍵盤輸入時間,內存使用狀態,硬碟空閑空間,IO延時,進程數量,線程數量等信息,CPU時鍾,來得到一個近似隨機的種子,主要是達到不可預測性。

暫時先寫到這里

⑹ java一鍵登錄discuz PHP論壇

小弟目前實現這個,有兩個辦法。第一個,是用戶再點擊登陸的時候給他加上一層遮罩,讓他不可以點別的了。第二個,就是用struts2的單點登錄,頁面配置token。這是兩個想法,你可以從這兩方面入手。你上面說的什麼md5,沒聽明白這跟單點登陸有什麼關系,單點登陸是防止用戶重復提交的

閱讀全文

與javatokenmd5相關的資料

熱點內容
編程如何讓人物重復發射子彈 瀏覽:853
db2查看錶空間文件 瀏覽:607
ps文件界面設置 瀏覽:779
c語言12位的數據應該怎麼存儲 瀏覽:953
將ape導入iphone 瀏覽:107
js組合快捷鍵 瀏覽:174
linux系統盤默認掛在的文件夾 瀏覽:667
淘寶數據包如何操作上架 瀏覽:567
vb編程中輸入cls是什麼意思 瀏覽:81
linuxtime服務 瀏覽:184
瘋狂安卓講義第二版代碼 瀏覽:420
老炮兒三小時版本下載 瀏覽:313
matlab怎麼調試程序 瀏覽:2
winxp升級win7的危害 瀏覽:496
網路沒連上卻不可用是怎麼回事 瀏覽:752
社區版本 瀏覽:738
怎麼查微信公眾號什麼時候開通的 瀏覽:717
安裝三菱編程閃退怎麼回事 瀏覽:488
手機怎麼創建word文件格式 瀏覽:694
c語言連接資料庫 瀏覽:887

友情鏈接