Tag: hmac

带有密钥的Java HmacSHA256

我已经尝试了一些来自stackoverflow的链接来获取HmacSHA256的密钥以使用java,但我总是得到 func check(body: String) -> String { let hash = body.hmac(HMACAlgorithm.sha256, key: Router.sigKey) print(“SIG: ” + Router.sigKey) print(“result of hash. \(hash)”) return hash } 此函数返回带有给定String的键的哈希值。 关键是:0393e944ee8108bb66fc9fa4f99f9c862481e9e0519e18232ba61b0767eee8c6 字符串是:示例 结果是:27effb76c97022497e25d3a5d7e823462f212a82d9ebba35f179071568b0c335 当我使用这个网站检查我的SHA256是否使用相同的密钥时,它返回相同的答案,所以我知道我在swift中的代码是好的。 但是当我尝试在java中执行此操作时,这里是源代码。 public static String HMAC_SHA(){ try { String secret = “0393e944ee8108bb66fc9fa4f99f9c862481e9e0519e18232ba61b0767eee8c6”; String message = “example”; Mac sha256_HMAC = Mac.getInstance(“HmacSHA256”); SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(), “HmacSHA256”); sha256_HMAC.init(secret_key); […]

Shopify oauth中的HMAC-SHA256问题(输出不匹配)

我正在尝试按照此文档在Shopify市场上发布应用程序。 而且我坚持在oauth文档的第3步,你必须做’HMAC签名validation’。 文档说明您必须使用应用程序的共享密钥通过HMAC-SHA256处理字符串(在下面指定)。 String = “shop=some-shop.myshopify.com&timestamp=1337178173” 我正在尝试使用Java实现这些步骤。 以下是我使用的代码的要点。 private static final String HMAC_ALGORITHM = “HmacSHA256”; String key = “hush”; String data = “shop=some-shop.myshopify.com&timestamp=1337178173”; SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(),HMAC_ALGORITHM); Mac mac = Mac.getInstance(HMAC_ALGORITHM); mac.init(keySpec); byte[] rawHmac = mac.doFinal(data.getBytes()); System.out.println(Hex.encodeHexString(rawHmac)); 代码生成以下字符串: c2812f39f84c32c2edaded339a1388abc9829babf351b684ab797f04cd94d4c7 通过Shopify开发者论坛上的一些随机搜索,我找到了一个问题的链接。 来自@Shayne的最后一条消息表明我们必须通过添加protocol字段来更改data变量。 但它没有成功:( 谁能告诉我应该做什么?我是否必须在我的代码中进行修改或者文档中的过程已经改变。 请帮忙。

将HMAC-SHA1从node.js转换为Java

我的任务是将一些现有的node.js代码转换为Java。 我觉得我很顺利,但现在我有点卡住了。 方法的输出似乎不匹配。 我正在做的是基于查询字符串创建SHA-1签名。 此查询字符串包含一些与查询相关的数据(与此问题无关)和API密钥。 重要 node.js中的api_secret字符串等同于Java中的Config.API_SECRET 。 示例查询字符串(在node.js和Java程序中它们相同): /events?festival=imaginate&pretty=1&size=100&from=0&key=SOME_KEY 实际代码 SHA-1 hmac在nodejs中初始化如下: const hmac = crypto.createHmac(‘sha1’, api_secret); SHA-1 mac在Java中初始化如下: final SecretKeySpec secretKeySpec = new SecretKeySpec(Config.API_SECRET.getBytes(“UTF-8”), “HmacSHA1”); final Mac hmac = Mac.getInstance(“HmacSHA1”); hmac.init(secretKeySpec); 接下来,node.js程序更新hmac( query参数如上所列): hmac.update(query, ‘ascii’); 我在Java中复制了这个( query参数等于node.js query参数): hmac.update(query.getBytes(“US-ASCII”)); 最后,在node.js程序中将字节字符串转换为SHA-1哈希: const signature = hmac.digest(‘hex’); 我找不到Java的确切翻译,但这是我的尝试,我认为这是关于同样的事情: 字节数组为hex函数 public static String byteArrayToHex(byte[] a) { StringBuilder […]

春季启动。 HMAC认证。 如何添加自定义AuthenticationProvider和身份validationfilter?

为了实现HMAC身份validation,我创建了自己的filter,提供者和令牌。 RestSecurityFilter: public class RestSecurityFilter extends AbstractAuthenticationProcessingFilter { private final Logger LOG = LoggerFactory.getLogger(RestSecurityFilter.class); private AuthenticationManager authenticationManager; public RestSecurityFilter(String defaultFilterProcessesUrl) { super(defaultFilterProcessesUrl); } public RestSecurityFilter(RequestMatcher requiresAuthenticationRequestMatcher) { super(requiresAuthenticationRequestMatcher); } @Override public Authentication attemptAuthentication(HttpServletRequest req, HttpServletResponse response) throws AuthenticationException, IOException, ServletException { AuthenticationRequestWrapper request = new AuthenticationRequestWrapper(req); // Get authorization headers String signature = request.getHeader(“Signature”); String […]

PHP HMAC SHA256哈希

我试图重建从Java到PHP的脚本 通常在php中我们做hash_mac(’sha256’,string,key)但是php中生成的签名与java不匹配… 这是java算法: Mac localMac = getValidMac(); localMac.init(new SecretKeySpec(str1.getBytes(“UTF-8”), localMac.getAlgorithm())); byte[] arrayOfByte = localMac.doFinal(paramString.getBytes()); BigInteger localBigInteger = new BigInteger(1, arrayOfByte); String str4 = String.format(“%0” + (arrayOfByte.length << 1) + "x", new Object[] { localBigInteger }); str3 = str4; return str3; Java中是否有任何不同的东西在键上添加一些字符串?

HMC SHA1哈希 – Java生成与C#不同的哈希输出

这是对这个问题的跟进,但我正在尝试将C#代码移植到Java而不是Ruby代码移植到C#,就像相关问题中的情况一样。 我正在尝试validation从Recurly.js api返回的加密签名是否有效。 不幸的是,Recurly没有Java库来协助validation,所以我必须自己实现签名validation。 根据上面的相关问题( this ),以下C#代码可以生成validation从Recurly返回的签名所需的哈希: var privateKey = Configuration.RecurlySection.Current.PrivateKey; var hashedKey = SHA1.Create().ComputeHash(Encoding.UTF8.GetBytes(privateKey)); var hmac = new HMACSHA1(hashedKey); var hash = hmac.ComputeHash(Encoding.ASCII.GetBytes(dataToProtect)); return BitConverter.ToString(hash).Replace(“-“, “”).ToLower(); Recurly在其签名文档页面上提供以下示例数据: 未加密的validation消息 :[1312701386,transactioncreate,[account_code:ABC,amount_in_cents:5000,货币:美元]] 私钥 :0123456789ABCDEF0123456789ABCDEF 结果签名 :0f5630424b32402ec03800e977cd7a8b13dbd153-1312701386 这是我的Java实现: String unencryptedMessage = “[1312701386,transactioncreate,[account_code:ABC,amount_in_cents:5000,currency:USD]]”; String privateKey = “0123456789ABCDEF0123456789ABCDEF”; String encryptedMessage = getHMACSHA1(unencryptedMessage, getSHA1(privateKey)); private static byte[] getSHA1(String source) throws NoSuchAlgorithmException, […]

Android(Java)方法相当于Hex中的Python HMAC-SHA256

我试图在Android(Java)中复制Python HMAC-SHA256等价物。 下面显示了Python表示的正确输出: python print (hmac.new(key = binascii.unhexlify(“0123465789”),msg = binascii.unhexlify(“ABCDEF”),digestmod=hashlib.sha256).hexdigest()).upper() Output 5B5EE08A20DDD645A31384E51AC581A4551E9BE5AC8BF7E690A5527F2B9372CB 但是,我无法使用以下代码在Java中获得相同的输出: Java的 Mac sha256_HMAC = Mac.getInstance(“HmacSHA256”); SecretKeySpec secretKey = new SecretKeySpec(“0123465789”.getBytes(“UTF-8”), “HmacSHA256”); sha256_HMAC.init(secretKey); byte[] hash = sha256_HMAC.doFinal(“ABCDEF”.getBytes(“UTF-8”)); String check = (new String(Hex.encodeHex(hash))).toUpperCase(); System.out.println(check); Output 46F9FD56BDAE29A803BAD5BC668CB78DA4C54A51E6C031FB3BC2C42855047213 我相当肯定我的问题是没有编写Python的Java代码: key = binascii.unhexlify(“0123465789”) & msg = binascii.unhexlify(“ABCDEF”) 这是因为当我不在Python中对Hex-String输入执行binascii.unhexlify时,我为这两种方法呈现相同的结果。 但是,Python HMAC-SHA256需要binascii.unhexlify操作。 我已经做了很多研究甚至尝试导入Python用于在Java中执行binascii.unhexlify的方法,但我仍然无法生成相同的结果。 在解决此问题时,任何帮助和/或建议都将不胜感激。 有人可以帮帮我吗?

在Android密钥库中存储hmac密钥

我使用下面的代码来创建一个hmac键并将其作为字符串返回。 KeyGenerator keyGen = null; try { keyGen = KeyGenerator.getInstance(“HmacSHA256”); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } SecretKey key = keyGen.generateKey(); byte[] encoded = key.getEncoded(); String s=Base64.encodeToString(encoded, Base64.DEFAULT); Log.i(“Hmac key before encrypt”,s); try { KeyStore keystore = KeyStore.getInstance(“AndroidKeyStore”); keystore.load(null, null); KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry) keystore.getEntry(“temp”, null); RSAPublicKey publicKey = (RSAPublicKey) privateKeyEntry.getCertificate().getPublicKey(); Cipher cipher = Cipher.getInstance(“RSA/ECB/PKCS1Padding”); […]

HKDF是否在Java Cryptography Architecture中实现?

在我写的应用程序中,我需要使用HKDF从一个密码中派生出两个不同的密钥。 在Java中搜索如何使用它的示例我发现了这两个: https://github.com/WhisperSystems/libsignal-protocol-java/blob/master/java/src/main/java/org/whispersystems/libsignal/kdf/HKDF.java https://www.javatips.net/api/keywhiz-master/hkdf/src/main/java/keywhiz/hkdf/Hkdf.java 在这两种情况下,HKDF都是在JCA提供的HMAC之上实施的。 我还没有详细阅读这些实现,但我想知道,这是不是在JCA或其自身的任何地方实现的? 我是否必须实施自己的HKDF? 最让我担心的部分是在应用info参数时犯了一个错误。 它看起来非常重要而且至关重要。

Java方法,可以为Hex中的HMAC-SHA256提供与Python方法相同的输出

我现在正尝试使用Java使用HMAC-SHA256对字符串进行编码。 使用hmac.new(mySecret, myPolicy, hashlib.sha256).hexdigest()匹配Python生成的另一组编码字符串所需的编码字符串。 我努力了 Mac sha256_HMAC = Mac.getInstance(“HmacSHA256”); SecretKeySpec secretKey = new SecretKeySpec(secret.getBytes(), “HmacSHA256”); sha256_HMAC.init(secretKey); byte[] hash = sha256_HMAC.doFinal(policy.getBytes()); byte[] hexB = new Hex().encode(hash); String check = Hex.encodeHexString(hash); String sha256 = DigestUtils.sha256Hex(secret.getBytes()); 打印出来后,hash,hexB,check和sha256没有提供与下面的Python加密方法相同的结果 hmac.new(mySecret, myPolicy, hashlib.sha256).hexdigest() 所以,我试图寻找与上述Python函数类似的库或其他东西。 有人可以帮帮我吗?