“ওপেনসেল ডিজিএসটি -১১১” একটি বহির্মুখী “(স্টিডিন) =” উপস্থাপনা এবং নতুন লাইনের অনুসরণ করছে


31

যদি আপনি আপনার ইউনিক্সে এই আদেশটি চালান

echo -n "foo" | openssl dgst -sha1

আপনি এই আউটপুট পাবেন:

(stdin)= 0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33

(একটি নতুন লাইন পরে)

আমি কীভাবে ওপেনসেলকে (stdin)=প্রিফিক্সটি না দেখানোর জন্য বাধ্য করতে পারি এবং অনুবর্তনযোগ্য নতুন লাইনটি এড়াতে পারি?


@ মার্কডাভিডসন হুম, আকর্ষণীয়। আপনি কি নিশ্চিত যে এটি একটি নতুন লাইনও যুক্ত করে নি?

উত্তর:


22

কাঁচা বাইনারি বিন্যাস কোনও বহিরাগত আউটপুট যোগ করে না।
বাইনারি হিসাবে আউটপুট তারপর হেক্সে রূপান্তর করুন:

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

এটি আপনাকে দেবে:

0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33

যদি কেউ আবার পাঠ্য আউটপুট ফর্ম্যাট পরিবর্তন করার সিদ্ধান্ত নেয় তবে এই পদ্ধতিটি ভবিষ্যতের প্রমাণ হওয়া উচিত। আমি নিশ্চিত যে তারা ফাইলের ইনপুটটির সাথে সামঞ্জস্য রাখতে "SHA1 (stdin) =" হওয়ার উপসর্গটি ঠিক করবে।

আমি বিশ্বাস করতে পারি না যে তারা এটিকে পরিবর্তন করেছে! আমি ভাবছি কত স্ক্রিপ্ট ভেঙে গেছে।


4
এটি কেবল প্রতি লাইনে 20-30 অক্টেট আউটপুট দেবে (বা 40-60 অক্ষর) SHA-256 চেকসামের জন্য, কখনও কখনও এটি যথেষ্ট হয় না। -c 256এটি প্রতি লাইনে 256 অক্টেটে প্রসারিত করতে বিকল্পটি ব্যবহার করুন ।
রকাল্লাইট

16

আমি উবুন্টু ১১.১০-তে ওপেনএসএসএল ১.০.০ এর অধীনে এই আচরণটি পর্যবেক্ষণ করছি, যেখানে ওপেনএসএসএল ০.৯.৮ কে এবং ০.৯.৮t আউটপুট কেবল হ্যাশ। ওপেনএসএসএল-এর কমান্ড লাইনটি নমনীয় হওয়ার জন্য ডিজাইন করা হয়নি, এটি কমান্ড লাইন থেকে ক্রিপ্টোগ্রাফিক গণনা সম্পাদনের আরও দ্রুত এবং মলিন উপায়।

আপনি যদি ওপেনএসএসএল ব্যবহার করতে চান তবে আউটপুটটি ফিল্টার করুন:

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

লিনাক্সে (জিএনইউ সরঞ্জাম বা ব্যজিবক্স সহ), আপনি ব্যবহার করতে পারেন sha1sum, যার জন্য ওপেনএসএসএল ইনস্টল করা প্রয়োজন হয় না এবং এর একটি স্থিতিশীল আউটপুট ফর্ম্যাট থাকে। এটি সর্বদা একটি ফাইলের নাম মুদ্রণ করে, তাই এটি বন্ধ করে দিন।

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

ওএসএক্স সহ বিএসডি সিস্টেমে আপনি ব্যবহার করতে পারেন sha1

echo -n "foo" | sha1 -q

এই সমস্ত আউটপুট চেকসাম হেক্সাডেসিমাল এর পরে একটি নতুন লাইন। ইউনিক্স সিস্টেমের অধীনে পাঠ্যটিতে সর্বদা রেখার ক্রম থাকে এবং প্রতিটি লাইন একটি নতুনরেখানের অক্ষর দিয়ে শেষ হয়। যদি আপনি কমান্ডের আউটপুট শেল ভেরিয়েবলে সঞ্চয় করেন তবে চূড়ান্ত নিউলাইনটি সরিয়ে ফেলা হবে।

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

আপনার যদি এমন কোনও প্রোগ্রামে ইনপুটটি পাইপ করা দরকার যেখানে চেকসামের কোনও চূড়ান্ত নিউলাইন নেই (যা সত্যই বিরল) থাকে তবে নিউলাইনটি সরিয়ে ফেলুন।

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

এটি হ'ল সঠিক পরিস্থিতি => অনুলিপি এবং সমাধানের মানচিত্রটি আটকে দিন। ধন্যবাদ!
oberstet

6

এখানে আরও একটি বিকল্প রয়েছে:

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

1
আমি জানি যে প্রশ্নটি এই নির্দিষ্ট ফর্ম্যাটটির সাথে জিজ্ঞাসা করছে, তবে, কেউ যদি ফাইল নাম অন্তর্ভুক্ত করার জন্য এটি প্রসারিত করার চেষ্টা করে তবে ফাইলনামের মধ্যে ফাঁকা স্থান থাকলে তা ভেঙে যেতে পারে। এখানে অবতরণ করা অন্যান্য লোকদের জন্য কেবল একটি মাথা।
ক্যামেরন গ্যাগন

2

পাইপ, অ্যাজ, সিড, ট্র, কাট ইত্যাদির পরিবর্তে ব্যাশ বিল্ট-ইনগুলি ব্যবহার করে এটি করার একটি উপায় এখানে রয়েছে:

output="$(openssl sha1 <(printf foo))"; echo ${output/* }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.