编辑:java equivalent to php's hmac-SHA1
(很有希望,尝试a.t.m。)
我的理解是,要创建签名,我需要一个'基本字符串'和一个'键'。我想我知道如何创建基本字符串,并且我认为我应该使用Google为我的应用分配的“OAuth Consumer Secret”作为密钥。
但是我应该用这两个来获取签名呢? GAE / Java上有没有HMAC课程?
如果我只是存储OAuth Playground为我生成的内容,它会播放吗?你是怎么做的?或者OAuth签名是否有一些到期日期?
(我之前尝试过AuthSub,但failed too,尽管它看起来很简单。而OAuth对我来说似乎更“标准”,所以我想坚持使用OAuth。)
答案 0 :(得分:2)
public String computeHmac(String baseString, String key)
throws NoSuchAlgorithmException, InvalidKeyException, IllegalStateException, UnsupportedEncodingException
{
Mac mac = Mac.getInstance("HmacSHA1");
SecretKeySpec secret = new SecretKeySpec(key.getBytes(), mac.getAlgorithm());
mac.init(secret);
byte[] digest = mac.doFinal(baseString.getBytes());
return Base64.encode(digest);
}
答案 1 :(得分:0)
出于某种原因,Quercus和GAE上的hmac_init会出错。一种解决方案是使用上面提到的java方法和类,将其导入PHP实例并调用compute。
1)添加你还没有的scr / phpgae目录ID 2)将phpgae.HmacSHA256行添加到src / WEB-INF / services / com.caucho.QuercusModule 3)将scr / phpgae / HmacSHA256.java添加到GAE应用程序中:
package phpgae;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import com.caucho.util.Base64;
import com.caucho.quercus.module.AbstractQuercusModule;
public class HmacSHA256 extends AbstractQuercusModule {
public String compute(String baseString, String key) throws InvalidKeyException, NoSuchAlgorithmException {
Mac mac;
mac = Mac.getInstance("HmacSHA256");
SecretKeySpec secret = new SecretKeySpec(key.getBytes(), mac.getAlgorithm());
mac.init(secret);
byte[] digest = mac.doFinal(baseString.getBytes());
return Base64.encode(digest);
}
}
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import com.caucho.util.Base64;
import com.caucho.quercus.module.AbstractQuercusModule;
public class HmacSHA256 extends AbstractQuercusModule {
public String compute(String baseString, String key) throws InvalidKeyException, NoSuchAlgorithmException {
Mac mac;
mac = Mac.getInstance("HmacSHA256");
SecretKeySpec secret = new SecretKeySpec(key.getBytes(), mac.getAlgorithm());
mac.init(secret);
byte[] digest = mac.doFinal(baseString.getBytes());
return Base64.encode(digest);
}
}
注意我在这里使用SHA256。 Eclipse会动态编译所有内容,否则您需要手动编译类。
4)在PHP上,你就是这样做的:
<?php
import phpgae.HmacSHA256;
$c = new HmacSHA256;
echo $c->compute( 'your base string' , 'your key' );
?>