我有一个java代码示例,使用HMAC-SHA1算法(RFC2104.)计算摘要,然后使用Base64编码(RFC2045)进行编码。
下面是java代码
public static String buildDigest(String key, String idString) throws SignatureException {
try {
String algorithm = "HmacSHA1";
Charset charset = Charset.forName("utf-8");
SecretKeySpec signingKey = new SecretKeySpec(key.getBytes(), algorithm);
Mac mac = Mac.getInstance(algorithm);
mac.init(signingKey);
return new String(Base64.encodeBase64(mac.doFinal(idString.getBytes(charset))), charset);
} catch (Exception e) {
throw new SignatureException("Failed to generate HMAC : " + e.getMessage());
}
}我在Stack Overflow中找到了答案,下面是C#代码
private string EncodeHMAC(string input, byte[] key)
{
HMACSHA1 myhmacsha1 = new HMACSHA1(key);
byte[] byteArray = Encoding.UTF8.GetBytes(input);
// MemoryStream stream = new MemoryStream(byteArray);
var hashValue = myhmacsha1.ComputeHash(byteArray);
return hashValue.Aggregate("", (s, e) => s + String.Format("{0:x2}", e), s => s);
}
private string EncodeTo64(string toEncode)
{
byte[] toEncodeAsBytes = System.Text.UTF8Encoding.UTF8.GetBytes(toEncode);
string returnValue = System.Convert.ToBase64String(toEncodeAsBytes);
return returnValue;
}我没有得到在tutorial that I am following中显示的正确结果
发布于 2013-01-08 21:48:41
试试这个:
// This method will return the base 64 encoded string using the given input and key.
private string EncodeHMAC(string input, byte[] key)
{
HMACSHA1 hmac = new HMACSHA1(key);
byte[] stringBytes = Encoding.UTF8.GetBytes(input);
byte[] hashedValue = hmac.ComputeHash(stringBytes);
return Convert.ToBase64String(hashedValue);
}我认为您没有正确地将散列值转换为base64字符串。
发布于 2013-01-08 22:21:57
我使用此函数来实现REST web服务调用的身份验证。发送者和接收者使用相同的编码是很重要的。
不幸的是,我花了一段时间才找到与这个C#版本相匹配的PHP。
private bool ValidateHash(String uid, String hash, DataToSign data) {
StringBuilder strToSign = new StringBuilder();
strToSign.Append(data.HttpMethod + '\n');
strToSign.Append(data.Date.ToString("r") + '\n');
strToSign.Append(data.Uri);
Byte[] secretBytes = UTF8Encoding.UTF8.GetBytes(this._secretKey);
HMACSHA1 hmac = new HMACSHA1(secretBytes);
Byte[] dataBytes = UTF8Encoding.UTF8.GetBytes(strToSign.ToString());
Byte[] calcHash = hmac.ComputeHash(dataBytes);
String calcHashString = Convert.ToBase64String(calcHash);
if (calcHashString.Equals(hash)) {
if (log.IsDebugEnabled) log.Debug(uid + " - [ValidateHash] HMAC is valid.");
return true;
}
return false;
}希望这能有所帮助!
https://stackoverflow.com/questions/14215726
复制相似问题