Bash'de HMAC-SHA1


97

HMAC-SHA1Karma oluşturmak için bir bash betiği var mı ?

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

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

Yanıtlar:


191

Bunun tam olarak istediğiniz şey olmadığının farkındayım, ancak tekerleği yeniden icat etmenin ve bir bash versiyonu yazmanın bir anlamı yok.

opensslKomut dosyanızın içinde hash oluşturmak için komutu kullanabilirsiniz .

[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ı unutmayın -nile echoya da başka bir satır sonu karakter dizesinin eklenen ve bu veri ve karma değiştirir edilir.

Bu komut, Linux / Unix, Cygwin ve benzerlerini seçtiğinizde zaten kurulmuş (veya kolayca yüklenmesi) gereken OpenSSL paketinden gelir.

opensslÜrünün eski sürümlerinin (RHEL4 ile birlikte gönderilenler gibi) bu -hmacseçeneği sağlamayabileceğini unutmayın .


Alternatif bir çözüm olarak, ancak esas olarak sonuçların aynı olduğunu kanıtlamak için, PHP'leri hmac_sha1()komut satırından da çağırabiliriz :

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

OpenSSL uygulamaları çok yavaştır. Ara sıra yapmanız gerekiyorsa sorun değil, ancak çok büyük miktarlarda karma hesaplamaya çalışıyorsanız, farklı yolları araştırmak istersiniz.
Marcin

1
@Marcin: Bununla bir kaynak aktarabilir misin?
sehe

6
HMAC-SHA256 ile aynı soruyu sordum. Aynı çözüm, ancak sha1yerine sha256:-)
mogsie

1
Evet yapabilirsiniz, ancak dosyanızdaki satır kırılmalarına dikkat edin, çünkü bu değerin bir parçası olarak kabul edilir.
Shawn Çene

1
@ShawnChin, bu örnekte, anahtarın kodlaması / formatı nedir? Kullanılarak oluşturulan özel bir anahtar gibi bir base64 kodlaması mı olmalı openssl genrsa? Ayrıca, openssl dokümantasyon bağlantısı bir 404 ile sonuçlanır.
Carlos Macasaet 18'15

41

İşte hash_hmacPHP'deki gibi çalışan bir bash işlevi :

#!/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"

Tamamlamanın güzel bir yolu. +1
Shawn Chin

+1 çünkü seçilen cevabın aksine, sorulan soruyu bu cevaplıyor. (Her ikisi de yardımcı olsa da.)
Alexx Roche

ancak, çok satırlıysa 'veri' bağımsız değişkenini betiğe nasıl iletirsiniz? Girintiyi kaybetmeden bir xml veya json gövdesi gibi.
HyperioN

Eğer bir dosyaya json verileri var ise @HyperioN sadece bu yapabilirdi: hash_hmac "sha1" "$(cat your-json-file)" "key". Alternatif olarak, openssl dgstbu hash_hmacişlevi kullanmadan dosyanızı aktarabilirsiniz .
Martin

İkili parça için teşekkürler. Bu benim için eksik parçaydı
jgreen

9

Hash_hmac işlevi için teşekkürler! Ancak başvurum için yeterli olmadı. Birinin merak etmesi durumunda, önceki hashing işleminin sonucu olan ve bu nedenle bir ikili giriş olan bir anahtarı kullanarak birkaç kez yeniden hash işlemi yapmak zorunda kaldım. (Amazon AWS kimlik doğrulama imzası bu şekilde oluşturulur.)

Dolayısıyla ihtiyacım olan şey, ikili anahtarı algoritmayı bozmayacak şekilde sağlamanın bir yoluydu. Sonra şunu buldum: http://openssl.6102.n7.nabble.com/command-line-hmac-with-key-in-hex-td6754.html

Stephen Henson'ın cevabı hash_hmac fonksiyonunun değeri onaltılık formatta döndürmesini gerektirir. Bu nedenle aşağıdakileri yansıtması gerekir:

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

Ardından bir sonraki çağrıda anahtarı hexit olarak sağlamanız gerekir:

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

Umarım bu herkese yardımcı olur, muhtemelen AWS'de CloudFront girişlerini geçersiz kılmak için bash betikleri oluşturmaya çalışan biri (benim gibi!) (Henüz test etmedim, ancak bence bash betiğimin nedeni budur. çalışmıyor ve benim PHP'im çalışıyor ...)


0

Node.js yüklendikten sonra HMAC-CLI aracını kullanabilirsiniz:

npx hmac-cli generate 'value' -h sha1 -s key

İadeler:

57443a4c052350a44638835d64fd66822f813319

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.