“Openssl dgst -sha1” yabancı bir “(stdin) =” ön eki ve izleyen bir yeni satır üretir


31

Bu komutu Unix'inizde çalıştırırsanız

echo -n "foo" | openssl dgst -sha1

Bu çıktıyı alacaksınız:

(stdin)= 0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33

(bunu bir newline takip eder).

Openssl'yi (stdin)=öneki göstermemeye ve izleyen yeni satırdan kaçınmaya nasıl zorlayabilirim ?


@MarkDavidson Hmm, ilginç. Yeni bir hat bile eklemediğinden emin misin?

Yanıtlar:


22

Ham ikili format, herhangi bir yabancı çıktı eklemiyor.
İkili olarak çıktı alın ve onaltılıma dönüştürün:

echo -n "foo" | openssl dgst -sha1 -binary | xxd -p

Sana şunu vereceğim:

0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33

Birisinin metin çıktı biçimini tekrar değiştirmeye karar vermesi durumunda, bu yöntem ileriye dönük olmalıdır. Bir dosya girişi ile tutarlı olması için "SHA1 (stdin) =" önekini düzelteceklerinden eminim.

Bunu değiştirdiklerine inanamıyorum! Kaç tane betiğin kırıldığını merak ediyorum.


4
Her satırda yalnızca 20-30 oktet (veya 40-60 karakter) verir. SHA-256 sağlama toplamı için bu bazen yeterli olmaz. -c 256Satır başına 256 oktete genişletmek için bu seçeneği kullanın .
Rockallite,

16

Bu davranışı Ubuntu 11.10'daki OpenSSL 1.0.0e altında gözlemlerken, OpenSSL 0.9.8k ve 0.9.8t çıktı sadece hash. OpenSSL'nin komut satırı esnek olarak tasarlanmamıştır, komut satırından kriptografik hesaplamalar yapmak için hızlı ve kirli bir yöntemdir.

OpenSSL kullanmak istiyorsanız, çıktıyı filtreleyin:

echo -n "foo" | openssl dgst -sha1 | sed 's/^.* //'

Linux'ta (GNU araçları veya BusyBox ile), sha1sumOpenSSL'in kurulmasını gerektirmeyen ve kararlı bir çıktı formatına sahip olan kullanabilirsiniz. Her zaman bir dosya adı yazdırır, bu yüzden soyun.

echo -n "foo" | sha1sum | sed 's/ .*//'

OSX içeren BSD sistemlerinde kullanabilirsiniz sha1.

echo -n "foo" | sha1 -q

Bunların hepsi sağlama toplamını onaltılık olarak takip eder ve ardından yeni bir satır yazar. Unix sistemleri altındaki metin her zaman bir dizi diziden oluşur ve her satır yeni satır karakteriyle sonlanır. Komutun çıktısını bir kabuk değişkeninde saklarsanız, son satırsonu çıkarılır.

digest=$(echo -n "foo" | openssl dgst -sha1 | sed 's/^.* //')

Girişi, son satırsonu olmayan (gerçekten nadir olan) bir sağlama toplamı gerektiren bir programa aktarmanız gerekirse, satırsonunu çıkarın.

echo -n "foo" | openssl dgst -sha1 | sed 's/^.* //' | tr -d '\n' | unusual_program

bu mükemmel bir durumdur => çözüm haritasını kopyala ve yapıştır. Teşekkürler!
oberstet

6

İşte başka bir alternatif:

echo -n "foo" | openssl sha1 | awk '{print $2}'

1
Sorunun bu özel formatta sorduğunu biliyorum, ancak eğer biri bunu dosya adlarını içerecek şekilde genişletmeye çalışırsa, dosya adında boşluklar varsa kırılabilir. Buraya inen diğer insanlar için sadece bir kafa kafaya.
Cameron Gagnon

2

Borular, awk, sed, tr, cut, etc yerine bash yerleşiklerini kullanarak yapmanın bir yolu:

output="$(openssl sha1 <(printf foo))"; echo ${output/* }
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.