① 如何C#使用HMAC-SHA1演算法生成oauth
1、HMACSHA1的概念
HMACSHA1 是
從 SHA1 哈希函數構造的一種鍵控哈希演算法,被用作 HMAC(基於哈希的消息驗證代碼)。此 HMAC
進程將密鑰與消息數據混合,使用哈希函數對混合結果進行哈希計算,將所得哈希值與該密鑰混合,然後再次應用哈希函數。輸出的哈希值長度為 160
位,可以轉換為指定位數。
上面是微軟的標準定義,我看了也沒太明白,他的作用一句話來理解:就是確認請求的URL或者參數是否存在被篡改,以QQ
簽名為例:發送方(自己)將參數等進行HMAC演算法計算,將得到的哈希值(即簽名值)與請求的參數一同提交至接收方(QQ端),然後接收方再次將參數等值
進行HMAC演算法計算,將得到的哈希值與你傳遞過來的哈希值進行核對驗證,若一樣,說明請求正確、驗證通過,進行一下步工作,若不一樣,將返回錯誤。
(下面說的夠詳細了吧,還不理解,留言給我)
2、QQ OAuth 1.0中用到的哈希演算法
/// <summary>
/// HMACSHA1演算法加密並返回ToBase64String
/// </summary>
/// <param name="strText">簽名參數字元串</param>
/// <param name="strKey">密鑰參數</param>
/// <returns>返回一個簽名值(即哈希值)</returns>
public static string ToBase64hmac(string strText, string strKey)
{
HMACSHA1 myHMACSHA1 = new HMACSHA1(Encoding.UTF8.GetBytes(strKey));
byte[] byteText = myHMACSHA1.ComputeHash(Encoding.UTF8.GetBytes(strText));
return System.Convert.ToBase64String(byteText);
}
或者寫成,原理一樣:
public static string HMACSHA1Text(string EncryptText, string EncryptKey)
{
//HMACSHA1加密
string message;
string key;
message = EncryptText;
key = EncryptKey;
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
byte[] keyByte = encoding.GetBytes(key);
HMACSHA1 hmacsha1 = new HMACSHA1(keyByte);
byte[] messageBytes = encoding.GetBytes(message);
byte[] hashmessage = hmacsha1.ComputeHash(messageBytes);
return ByteToString(hashmessage);
}
前面都注釋了參數含義,就不再說明了。COPY就可使用
註明:頁面請引用
using System.Security.Cryptography;
3、介紹另外一種HMACSHA1演算法的寫法
public static string HMACSHA1Text(string EncryptText, string EncryptKey)
{
//HMACSHA1加密
HMACSHA1 hmacsha1 = new HMACSHA1();
hmacsha1.Key = System.Text.Encoding.UTF8.GetBytes(EncryptKey);
byte[] dataBuffer = System.Text.Encoding.UTF8.GetBytes(EncryptText);
byte[] hashBytes = hmacsha1.ComputeHash(dataBuffer);
return Convert.ToBase64String(hashBytes);
}
② 求教PHP和java大神 base64_encode(hash_hmac('sha1',$public_key,$private_key,TRUE)); 轉 java
如果你的API服務安全認證協議中要求使用hmac_sha1方法對信息進行編碼,
而你的服務是由PHP實現的,客戶端是由JAVA實現的,那麼為了對簽名正確比對,就需要在兩者之間建立能匹配的編碼方式.
efine('ID','123456');
define('KEY','k123456');
$strToSign = "test_string";
$utf8Str = mb_convert_encoding($strToSign, "UTF-8");
$hmac_sha1_str = base64_encode(hash_hmac("sha1", $utf8Str, KEY));
$signature = urlencode($hmac_sha1_str);
print_r($signature);
JAVA側需要注意如下幾點:
1. hmac_sha1編碼結果需要轉換成hex格式
2. java中base64的實現和php不一致,其中java並不會在字元串末尾填補=號以把位元組數補充為8的整數
3. hmac_sha1並非sha1, hmac_sha1是需要共享密鑰的
參考實現如下:
[java] view plain
import java.io.UnsupportedEncodingException;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import org.apache.wicket.util.crypt.Base64UrlSafe;
public class test {
public static void main(String[] args) {
String key = "";
String toHash = "GET"+"\n"+"Thu, 09 Aug 2012 13:33:46 +0000"+"\n"+"/ApiChannel/Report.m";
//String toHashUtf8 = URLEncoder.encode(toHash, "UTF-8");
String res = hmac_sha1(toHash, key);
//System.out.print(res+"\n");
String signature;
try {
signature = new String(Base64UrlSafe.encodeBase64(res.getBytes()),"UTF-8");
signature = appendEqualSign(signature);
System.out.print(signature);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
public static String hmac_sha1(String value, String key) {
try {
// Get an hmac_sha1 key from the raw key bytes
byte[] keyBytes = key.getBytes();
SecretKeySpec signingKey = new SecretKeySpec(keyBytes, "HmacSHA1");
// Get an hmac_sha1 Mac instance and initialize with the signing key
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(signingKey);
// Compute the hmac on input data bytes
byte[] rawHmac = mac.doFinal(value.getBytes());
// Convert raw bytes to Hex
String hexBytes = byte2hex(rawHmac);
return hexBytes;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private static String byte2hex(final byte[] b){
String hs="";
String stmp="";
for (int n=0; n<b.length; n++){
stmp=(java.lang.Integer.toHexString(b[n] & 0xFF));
if (stmp.length()==1) hs=hs+"0"+stmp;
else hs=hs+stmp;
}
return hs;
}
private static String appendEqualSign(String s){
int len = s.length();
int appendNum = 8 - (int)(len/8);
for (int n=0; n<appendNum; n++){
s += "%3D";
}
return s;
}
}
參考:http://www.iteye.com/topic/1002652
③ sha1校驗工具做什麼的什麼意思
校驗你來的SHA1的HASH值的,文件被保存下來自就有這個值,原始文件在網路傳輸前被生成的原值,經過網路傳輸以後如果文件有所損壞原值可能發生變化,這個時候SHA1就會變,所以SHA1工具是用來校驗文件是否損壞的工具。
④ HmacSHA1 演算法
「HMAC是密鑰相關的哈希運算消息認證碼(Hash-based Message Authentication Code),HMAC運算櫻伏利用哈希演算法,以一個核態密鑰和一個消息為輸入,生成一個消息摘要作為輸出。」
可以看出,HMAC是需要一個密鑰的改頌源。所以,HMAC_SHA1也是需要一個密鑰的,而SHA1不需要。
⑤ 函數HMAC-SHA1
HMAC
根據RFC 2316(Report of the IAB,April 1998),HMAC(散列消息身份驗證碼: Hashed Message Authentication Code)以及IPSec被認為是Interact安全的關鍵性核心協議。它不是散列函數,而是採用了將MD5或SHA1散列函數與共享機密密鑰(與公鑰/私鑰對不同)一起使用的消息身份驗證機制。基本來說,消息與密鑰組合並運行散列函數。然後運行結果與密鑰組合並再次運行散列函數。這個128位的結果被截斷成96位,成為MAC.
hmac主要應用在身份驗證中,它的使用方法是這樣的:
1. 客戶端發出登錄請求(假設是瀏覽器的GET請求)
2. 伺服器返回一個隨機值,並在會話中記錄這個隨機值
3. 客戶端將該隨機值作為密鑰,用戶密碼進行hmac運算,然後提交給伺服器
4. 伺服器讀取用戶資料庫中的用戶密碼和步驟2中發送的隨機值做與客戶端一樣的hmac運算,然後與用戶發送的結果比較,如果結果一致則驗證用戶合法
在這個過程中,可能遭到安全攻擊的是伺服器發送的隨機值和用戶發送的hmac結果,而對於截獲了這兩個值的黑客而言這兩個值是沒有意義的,絕無獲取用戶密碼的可能性,隨機值的引入使hmac只在當前會話中有效,大大增強了安全性和實用性。大多數的語言都實現了hmac演算法,比如php的mhash、python的hmac.py、java的MessageDigest類,在web驗證中使用hmac也是可行的,用js進行md5運算的速度也是比較快的。
SHA
安全散列演算法SHA(Secure Hash Algorithm)是美國國家標准和技術局發布的國家標准FIPS PUB 180-1,一般稱為SHA-1。其對長度不超過264二進制位的消息產生160位的消息摘要輸出,按512比特塊處理其輸入。
SHA是一種數據加密演算法,該演算法經過加密專家多年來的發展和改進已日益完善,現在已成為公認的最安全的散列演算法之一,並被廣泛使用。該演算法的思想是接收一段明文,然後以一種不可逆的方式將它轉換成一段(通常更小)密文,也可以簡單的理解為取一串輸入碼(稱為預映射或信息),並把它們轉化為長度較短、位數固定的輸出序列即散列值(也稱為信息摘要或信息認證代碼)的過程。散列函數值可以說時對明文的一種「指紋」或是「摘要」所以對散列值的數字簽名就可以視為對此明文的數字簽名。
HMAC_SHA1
HMAC_SHA1(Hashed Message Authentication Code, Secure Hash Algorithm)是一種安全的基於加密hash函數和共享密鑰的消息認證協議。它可以有效地防止數據在傳輸過程中被截獲和篡改,維護了數據的完整性、可靠性和安全性。HMAC_SHA1消息認證機制的成功在於一個加密的hash函數、一個加密的隨機密鑰和一個安全的密鑰交換機制。
HMAC_SHA1 其實還是一種散列演算法,只不過是用密鑰來求取摘要值的散列演算法。
HMAC_SHA1演算法在身份驗證和數據完整性方面可以得到很好的應用,在目前網路安全也得到較好的實現。
⑥ 如何生成HMAC在Java中相當於一個Python的例子嗎
1. HMACSHA1似乎是你所需要的演算法:SecretKeySpec keySpec = new SecretKeySpec(
"".getBytes(),
"HmacSHA1");
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(keySpec);
byte[] result = mac.doFinal("foo".getBytes());
BASE64Encoder encoder = new BASE64Encoder();
System.out.println(encoder.encode(result));
生產:+3h2gpjf4xcynjCGU5lbdMBwGOc=
請注意,我sun.misc.BASE64Encoder為迅速在這里,但你應該不依賴於太陽的JRE。以base64編碼器在下議院編解碼器將是一個更好的選擇,例如。
2. A小調的事情,但如果你正在尋找一個相當於HMAC(那麼默認的Python庫的MD5演算法,所以你需要的HMACMD5演算法在Java中。 這個我有這個確切的問題,並認為此答案這是有幫助的 CodeGo.net,但我錯過了一個地方傳遞到HMAC()的一部分,並就下一個兔子洞。希望這個答案可以防止其他人做的未來。 例如在Python REPL>>> import hmac
>>> hmac.new("keyValueGoesHere", "secretMessageToHash").hexdigest()
''
這等效於import org.apache.commons.codec.binary.Hex;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
public class HashingUtility {
public static String HMAC_MD5_encode(String key, String message) throws Exception {
SecretKeySpec keySpec = new SecretKeySpec(
key.getBytes(),
"HmacMD5");
Mac mac = Mac.getInstance("HmacMD5");
mac.init(keySpec);
byte[] rawHmac = mac.doFinal(message.getBytes());
return Hex.encodeHexString(rawHmac);
}
}
請注意,在我的例子我在干什麼。hexdigest相當於()
⑦ 怎麼用java實現HMAC-SHA1
以下代碼為JAVABEAN,加密用
[PHP]
package test;
/*
* Copyright 1997-2001 by Sun Microsystems, Inc.,
* 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
* All rights reserved.
*
* This software is the confidential and proprietary information
* of Sun Microsystems, Inc. ("Confidential Information". You
* shall not disclose such Confidential Information and shall use
* it only in accordance with the terms of the license agreement
* you entered into with Sun.
*/
import java.security.*;
import javax.crypto.*;
/*
* This program demonstrates how to generate a secret-key object for
* HMAC-SHA1, and initialize an HMAC-SHA1 object with it.
*/
public class initMac {
public initMac() {
}
//定義加密演算法
String Algorithm = "HmacSHA1";
public byte[] HmacSHA1(String post) throws Exception {
// Generate secret key for HMAC-SHA1
KeyGenerator kg = KeyGenerator.getInstance(Algorithm);
SecretKey sk = kg.generateKey();
// Get instance of Mac object implementing HMAC-SHA1, and
// initialize it with the above secret key
Mac mac = Mac.getInstance(Algorithm);
mac.init(sk);
byte[] result = mac.doFinal(post.getBytes());
return result;
}
}
[/PHP]
以下代碼為調用上面JAVABEAN的部分
[PHP]package test;
import test.initMac;
/**
* <p>Title: </p>
*
* <p>Description: </p>
⑧ nodejs裡面怎麼實現HMAC-SHA1
1)crypto模塊
crypto.createHmac('sha1',app_secret).update('待加密字串').digest().toString('base64');//base64
crypto.createHmac('sha1',app_secret).update('待加密字串').digest('hex');//16進制
2)crypto-js
varCryptoJS=require('crypto-js');
varstr='orderId=21140600050549799429&orderStatus=TRADE_SUCCESS&payTime=2014-07-2211:43:31';
varkey='REzySUKRCPfyfV/jfgwTA==';
varsign=CryptoJS.HmacSHA1(str,key).toString();
console.log(sign);