Soru Bash içinde HMAC-SHA1


Oluşturmak için bir bash betiği var mı HMAC-SHA1 karma?

Aşağıdaki PHP koduna eşdeğer bir şey arıyorum:

hash_hmac("sha1", "value", "key");

76
2017-09-02 14:36


Menşei




Cevaplar:


Bunun tam olarak istediğin şey olmadığını anlıyorum, ama tekerleği yeniden icat etmek ve bir bash versiyonunu yazmanın bir anlamı yok.

Sadece kullanabilirsiniz openssl komut dosyası içinde karma oluşturmak için komut.

[me@home] echo -n "value" | openssl dgst -sha1 -hmac "key"
57443a4c052350a44638835d64fd66822f813319

Ya da sadece:

[me@home] echo -n "value" | openssl sha1 -hmac "key"
57443a4c052350a44638835d64fd66822f813319

Kullanmayı unutma -n ile echo veya başka bir satır sonu karakteri dizeye eklenir ve bu da verilerinizi ve karma değerini değiştirir.

Bu komut, Linux / Unix, Cygwin ve beğenilerinizde zaten kurulu olan (veya kolayca kurulabilen) OpenSSL paketinden geliyor.

Eski sürümleri unutmayın openssl (RHEL4 ile gönderilenler gibi) -hmac seçeneği.


Alternatif bir çözüm olarak, ancak sonuçların aynı olduğunu kanıtlamak için PHP’yi de hmac_sha1() komut satırından:

[me@home]$ echo '<?= hash_hmac("sha1", "value", "key") ?>' | php
57443a4c052350a44638835d64fd66822f813319

147
2017-09-02 14:52



OpenSSL uygulamaları çok yavaştır. Eğer zaman zaman yapmanız gerekiyorsa, bu iyi bir şeydir, ancak muazzam miktarda karmaşayı hesaplamaya çalışıyorsanız, farklı yolları araştırmak istersiniz. - Marcin
@Marcin: bununla bir kaynak koyabilir misiniz? - sehe
HMAC-SHA256 ile aynı soru vardı. Aynı çözüm, ama sha1 ile değiştirilir sha256 :-) - mogsie
Evet, ancak dosyanızın içindeki linebreaks'lara dikkat edin, çünkü bu, değerin bir parçası olarak düşünülebilir. - Shawn Chin
@ShawnChin, bu örnekte, anahtarın kodlama / formatı nedir? Kullanılarak oluşturulan bir özel anahtar gibi kodlanmış bir base64 olması openssl genrsa? Ayrıca, openssl belge bağlantısı bir 404 ile sonuçlanır. - Carlos Macasaet


İşte böyle çalışan bir bash işlevi hash_hmac PHP'den:

#!/bin/bash

function hash_hmac {
  digest="$1"
  data="$2"
  key="$3"
  shift 3
  echo -n "$data" | openssl dgst "-$digest" -hmac "$key" "$@"
}

# hex output by default
hash_hmac "sha1" "value" "key"

# raw output by adding the "-binary" flag
hash_hmac "sha1" "value" "key" -binary | base64

# other algos also work
hash_hmac "md5"  "value" "key"

32
2017-09-12 08:36



Sarmak için güzel bir yol. +1 - Shawn Chin
-binary için teşekkürler :) - Manav
+1, seçilen cevaptan farklı olarak, sorulan soruya cevap verir. (Her ikisi de yararlı olsa da) - Alexx Roche
@Mark Bu kabul edilen cevap olmalı. - Yokai
Ancak, çoklu veri ise 'veri' argümanını senaryona nasıl aktarıyorsunuz? Girintiyi kaybetmeden xml veya json gövdesi gibi. - HyperioN


Hash_hmac işlevi için teşekkürler! Ama başvurum için yeterli değildi. Birisinin merak ettiği durumda, bir önceki karmaşanın sonucu olan bir anahtar kullanarak birkaç kez yeniden karmak zorunda kaldım ve bu yüzden ikili bir girdi. (Amazon AWS kimlik doğrulama imzası bu şekilde oluşturulur.)

Yani ihtiyacım olan şey, ikili anahtarı, algoritmayı bozmayacak şekilde tedarik etmenin bir yoluydu. Sonra bunu buldum: http://openssl.6102.n7.nabble.com/command-line-hmac-with-key-in-hex-td6754.html

Stephen Henson'un cevabı, değeri hex biçiminde döndürmek için hash_hmac işlevini gerektirir. Yani aşağıdakileri yankılanması gerekiyor:

$ echo -n "$data" | openssl dgst "-$digest" -hmac "$key" | sed -e 's/^.* //'

Ardından, sonraki çağrının anahtarı bir hexit olarak sağlaması gerekir:

$ echo -n "$data" | openssl dgst "-$digest" -mac HMAC -macopt "hexkey:$key" | sed -e 's/^.* //'

Umarım bu, herkese, muhtemelen AWS'de CloudFront girişlerini geçersiz kılmak için bash betikleri oluşturmaya çalışan birisine yardımcı olur (benim gibi!) (Henüz test etmedim, ama bence bu benim bash scriptimin nedeninin sebebi) çalışmıyor ve benim PHP'im ...)


3
2018-03-13 05:13





Komut satırında daha fazla JWT keşfetmek isteyenler için: serin jwt bash komut dosyası


0
2018-02-07 23:04