Python SHA-256 হ্যাশ — hashlib গাইড ও কোড উদাহরণ
বিনামূল্যে অনলাইন SHA-256 হ্যাশ জেনারেটর সরাসরি আপনার ব্রাউজারে ব্যবহার করুন — ইনস্টলের প্রয়োজন নেই।
SHA-256 হ্যাশ জেনারেটর অনলাইনে ব্যবহার করুন →আমি যতগুলো ডিপ্লয়মেন্ট পাইপলাইন তৈরি করেছি, প্রায় প্রতিটিতেই ফাইল চেকসাম যাচাই, ওয়েবহুক পেলোড স্বাক্ষর বা ক্যাশ কী ফিঙ্গারপ্রিন্টিংয়ের প্রয়োজন হয়েছে। অন্তর্নির্মিত hashlib মডিউল দিয়ে Python SHA-256 হ্যাশিং এই সব ক্ষেত্র সামলায় — এবং এটি আগে থেকেই ইনস্টল করা আছে। hashlib.sha256() CPython-এ OpenSSL-এর বাস্তবায়ন ব্যবহার করে, তাই এটি দ্রুত এবং বাক্স থেকেই FIPS-সামঞ্জস্যপূর্ণ। কোড না লিখে দ্রুত একটি হ্যাশের জন্য, অনলাইন SHA-256 হ্যাশ জেনারেটর তাৎক্ষণিক ফলাফল দেয়। সমস্ত উদাহরণ Python 3.9+ লক্ষ্য করে।
- ✓hashlib.sha256(data).hexdigest() হল বাইট হ্যাশ করার প্রমাণিত পদ্ধতি — stdlib-এর অংশ, OpenSSL-চালিত।
- ✓স্ট্রিং আগে বাইটে এনকোড করতে হবে: hashlib.sha256("text".encode("utf-8"))।
- ✓ফাইল চেকসামের জন্য .update() দিয়ে খণ্ডে প্রবেশ করান — বড় ফাইল একসাথে মেমোরিতে পড়বেন না।
- ✓HMAC-SHA256-এর জন্য hmac মডিউল প্রয়োজন: hmac.new(key, msg, hashlib.sha256) — SHA-256 একা চাবিহীন।
SHA-256 হ্যাশিং কী?
SHA-256 (Secure Hash Algorithm, 256-bit) যেকোনো দৈর্ঘ্যের ইনপুট নিয়ে নির্দিষ্ট ২৫৬-বিট (৩২-বাইট) ডাইজেস্ট তৈরি করে। একই ইনপুট সবসময় একই আউটপুট দেয়, কিন্তু ইনপুটে একটি বিটের পরিবর্তনেও সম্পূর্ণ আলাদা হ্যাশ তৈরি হয় — এই বৈশিষ্ট্যকে অ্যাভালাঞ্চ প্রভাব বলে। SHA-256 SHA-2 পরিবারের অংশ, NIST কর্তৃক মানকীকৃত, এবং TLS সার্টিফিকেট ফিঙ্গারপ্রিন্ট, Git কমিট আইডি, Bitcoin ব্লক হেডার এবং ফাইল অখণ্ডতা যাচাইয়ের মেরুদণ্ড। অ্যালগরিদম ২৫৬-বিট আউটপুট তৈরিতে ৬৪টি সংকোচন রাউন্ড সহ Merkle-Damgård নির্মাণ ব্যবহার করে।
deployment-v4.2.1
a1f7c3d8e9b2...27ae41e4649b (64 hex chars)
উপরের হেক্স ডাইজেস্ট প্রমাণিত উপস্থাপনা — ৬৪টি হেক্সাডেসিমাল অক্ষর, আপনি একটি বাইট হ্যাশ করুন বা পুরো ডিস্ক ইমেজ, সবসময় একই দৈর্ঘ্য।
hashlib.sha256() — স্ট্যান্ডার্ড লাইব্রেরি পদ্ধতি
hashlib মডিউল প্রতিটি Python ইনস্টলেশনের সাথে আসে — pip install প্রয়োজন নেই। হ্যাশ অবজেক্ট তৈরি করতে bytes আর্গুমেন্ট দিয়ে hashlib.sha256() কল করুন, তারপর .hexdigest() (হেক্স স্ট্রিং) বা .digest() (কাঁচা বাইট) দিয়ে ফলাফল নিন। ফাংশনের নাম ছোট হাতে: sha256,SHA256 নয়।
import hashlib # বাইট স্ট্রিং সরাসরি হ্যাশ করুন digest = hashlib.sha256(b"deployment-v4.2.1").hexdigest() print(digest) # a8f5f167f44f4964e6c998dee827110c3f1de4d0280c68cba98cf70b4b5157db
hashlib.sha256() ব্যবহারে সবচেয়ে সাধারণ ভুল হল bytes এর পরিবর্তে str পাস করা। Python স্ট্রিং ইউনিকোড, এবং হ্যাশ ফাংশন কাঁচা বাইটে কাজ করে। হ্যাশ করার আগে .encode("utf-8") কল করতে হবে। প্রথমবার প্রায় সবাই এতে বিভ্রান্ত হন।
import hashlib
# হ্যাশ করার আগে স্ট্রিং বাইটে এনকোড করতে হবে
config_key = "redis://cache.internal:6379/0"
digest = hashlib.sha256(config_key.encode("utf-8")).hexdigest()
print(digest)
# 7d3f8c2a1b9e4f5d6c8a7b3e2f1d9c4a5b8e7f6d3c2a1b9e4f5d6c8a7b3e2f1d.update() মেথড ডেটা ক্রমান্বয়ে প্রবেশ করাতে দেয়। h.update(a); h.update(b) কল করা hashlib.sha256(a + b) এর সমতুল্য। পুরো বিষয়বস্তু মেমোরিতে না লোড করে ফাইল খণ্ডে হ্যাশ করার এটিই পদ্ধতি।
import hashlib h = hashlib.sha256() h.update(b"request_id=req_7f3a91bc") h.update(b"×tamp=1741614120") h.update(b"&amount=4999") print(h.hexdigest()) # hashlib.sha256(b"request_id=req_7f3a91bc×tamp=1741614120&amount=4999").hexdigest()-এর সমতুল্য
.digest() কাঁচা ৩২ বাইট ফেরত দেয়। .hexdigest() ৬৪-অক্ষরের হেক্স স্ট্রিং ফেরত দেয়। HMAC-এ প্রবেশ করানো, Base64 এনকোডিং বা বাইনারি প্রোটোকলের জন্য .digest() ব্যবহার করুন। লগিং, ডেটাবেস কলাম ও চেকসাম তুলনার জন্য .hexdigest() ব্যবহার করুন।HMAC-SHA256 — hmac মডিউল দিয়ে চাবিযুক্ত হ্যাশিং
SHA-256 একা কোনো গোপন চাবির ধারণা রাখে না — একই ইনপুট যে কেউ থেকে একই হ্যাশ গণনা করতে পারে। একটি বার্তা নির্দিষ্ট প্রেরক থেকে এসেছে প্রমাণ করতে (ওয়েবহুক যাচাই, API অনুরোধ স্বাক্ষর, টোকেন প্রমাণীকরণ), HMAC প্রয়োজন। hmac মডিউল Python-এর স্ট্যান্ডার্ড লাইব্রেরির অংশ এবং চাবিটিকে হ্যাশিং প্রক্রিয়ায় অন্তর্ভুক্ত করে যাতে কেবল চাবিধারী ব্যক্তি একই ডাইজেস্ট তৈরি বা যাচাই করতে পারেন।
import hmac
import hashlib
# ওয়েবহুক স্বাক্ষর যাচাই
secret_key = b"whsec_9f3a7b2e1d4c8a5b"
payload = b'{"event":"invoice.paid","invoice_id":"inv_8d2c","amount":14900}'
signature = hmac.new(secret_key, payload, hashlib.sha256).hexdigest()
print(signature)
# 64-character hex HMAC-SHA256 digestআগত HMAC যাচাইয়ের জন্য == অপারেটরের পরিবর্তে hmac.compare_digest() ব্যবহার করতে হবে। সমতা অপারেটর টাইমিং আক্রমণের প্রতি ঝুঁকিপূর্ণ — এটি প্রথম অমিল বাইটেই সংক্ষিপ্ত হয়, এবং আক্রমণকারী প্রতিক্রিয়ার সময় পরিমাপ করে সঠিক স্বাক্ষর বাইট বাই বাইট অনুমান করতে পারে। compare_digest() অমিল যেখানেই হোক ধ্রুবক সময়ে চলে।
import hmac
import hashlib
def verify_webhook(payload: bytes, received_sig: str, secret: bytes) -> bool:
"""ধ্রুবক-সময় তুলনা ব্যবহার করে ওয়েবহুক স্বাক্ষর যাচাই করুন।"""
expected = hmac.new(secret, payload, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, received_sig)
# Stripe-স্টাইল ওয়েবহুক যাচাই অনুকরণ
incoming_payload = b'{"event":"payment.completed","amount":4999}'
incoming_signature = "a1b2c3d4e5f6..." # X-Signature হেডার থেকে
webhook_secret = b"whsec_9f3a7b2e1d4c"
if verify_webhook(incoming_payload, incoming_signature, webhook_secret):
print("স্বাক্ষর বৈধ — ইভেন্ট প্রক্রিয়া করুন")
else:
print("স্বাক্ষর অমিল — অনুরোধ প্রত্যাখ্যান করুন")HMAC-SHA256 অনুরোধ স্বাক্ষর
API অনুরোধ স্বাক্ষর একই নীতি অনুসরণ করে: অনুরোধের উপাদান থেকে (মেথড, পাথ, টাইমস্ট্যাম্প, বডি হ্যাশ) একটি ক্যানোনিকাল স্ট্রিং তৈরি করুন এবং গোপন চাবি দিয়ে স্বাক্ষর করুন। AWS Signature V4, Stripe এবং GitHub ওয়েবহুক সবাই এই প্যাটার্নের বিভিন্নতা ব্যবহার করে।
import hmac
import hashlib
import time
def sign_request(method: str, path: str, body: bytes, secret: bytes) -> str:
"""API অনুরোধের জন্য HMAC-SHA256 স্বাক্ষর তৈরি করুন।"""
timestamp = str(int(time.time()))
body_hash = hashlib.sha256(body).hexdigest()
# ক্যানোনিকাল স্ট্রিং: method + path + timestamp + body hash
canonical = f"{method}\n{path}\n{timestamp}\n{body_hash}"
signature = hmac.new(secret, canonical.encode("utf-8"), hashlib.sha256).hexdigest()
return f"ts={timestamp},sig={signature}"
# ব্যবহার
api_secret = b"sk_live_9f3a7b2e1d4c8a5b6e7f"
request_body = b'{"customer_id":"cust_4f2a","plan":"enterprise"}'
auth_header = sign_request("POST", "/api/v2/subscriptions", request_body, api_secret)
print(f"Authorization: HMAC-SHA256 {auth_header}")
# Authorization: HMAC-SHA256 ts=1741614120,sig=7d3f8c2a...Base64-এনকোড করা HMAC-SHA256
কিছু API (AWS Signature V4, বিভিন্ন পেমেন্ট গেটওয়ে) হেক্সের পরিবর্তে Base64-এনকোড করা স্ট্রিং হিসেবে HMAC ফলাফল প্রত্যাশা করে। পার্থক্য: হেক্স ৬৪ অক্ষর ব্যবহার করে, Base64 একই ৩২-বাইট ডাইজেস্টের জন্য ৪৪ অক্ষর ব্যবহার করে।
import hmac
import hashlib
import base64
secret = b"webhook_secret_9f3a"
message = b"POST /api/v2/events 1741614120"
# হেক্স আউটপুট: ৬৪ অক্ষর
hex_sig = hmac.new(secret, message, hashlib.sha256).hexdigest()
print(f"Hex: {hex_sig}")
# Base64 আউটপুট: ৪৪ অক্ষর (ছোট, HTTP হেডারে সাধারণ)
raw_sig = hmac.new(secret, message, hashlib.sha256).digest()
b64_sig = base64.b64encode(raw_sig).decode("ascii")
print(f"Base64: {b64_sig}")datetime, UUID এবং কাস্টম অবজেক্ট হ্যাশ করা
SHA-256 কাঁচা বাইটে কাজ করে, তাই বাইট-বহির্ভূত ধরন — datetime, UUID, dataclass, Pydantic মডেল — হ্যাশ করার আগে বাইটে রূপান্তর করতে হবে। কোনো স্বয়ংক্রিয় রূপান্তর নেই; আপনি ক্যানোনিকাল উপস্থাপনা বেছে নেন। সিস্টেম জুড়ে নির্ধারিত হ্যাশিংয়ের জন্য সবসময় স্পষ্ট এনকোডিং এবং স্থিতিশীল সিরিয়ালাইজেশন ফরম্যাট ব্যবহার করুন (datetime-এর জন্য ISO 8601, UUID-এর জন্য প্রমাণিত স্ট্রিং রূপ, dict-এর জন্য বাছাই-চাবি JSON)।
import hashlib
import uuid
from datetime import datetime, timezone
# datetime — বহনযোগ্যতার জন্য স্পষ্ট UTC অফসেট সহ ISO 8601 ব্যবহার করুন
event_time = datetime(2026, 3, 28, 12, 0, 0, tzinfo=timezone.utc)
time_hash = hashlib.sha256(event_time.isoformat().encode("utf-8")).hexdigest()
print(f"datetime hash: {time_hash[:16]}...")
# UUID — ক্যানোনিকাল স্ট্রিং রূপ হ্যাশ করুন (ছোট হাতে, হাইফেন সহ)
record_id = uuid.uuid4()
uuid_hash = hashlib.sha256(str(record_id).encode("utf-8")).hexdigest()
print(f"UUID hash: {uuid_hash[:16]}...")কাস্টম অবজেক্টের জন্য, হ্যাশ করার আগে ক্যানোনিকাল বাইট উপস্থাপনায় রূপান্তর করুন। dict-সদৃশ অবজেক্টের জন্য বাছাই-চাবি JSON ভালো কাজ করে:
import hashlib
import json
from dataclasses import dataclass, asdict
@dataclass
class Event:
id: str
type: str
amount: int
timestamp: str
def hash_event(event: Event) -> str:
"""নির্ধারণের জন্য বাছাই-চাবি JSON ব্যবহার করে dataclass উদাহরণ হ্যাশ করুন।"""
canonical = json.dumps(asdict(event), sort_keys=True, separators=(",", ":"))
return hashlib.sha256(canonical.encode("utf-8")).hexdigest()
e = Event(id="evt_4f2a", type="payment.completed", amount=4999, timestamp="2026-03-28T12:00:00Z")
print(hash_event(e)) # চালন ও মেশিন জুড়ে স্থিতিশীলsort_keys=True)। Python 3.7+-এ dict সন্নিবেশ ক্রম সংরক্ষিত হয় কিন্তু সিরিয়ালাইজেশন পথ জুড়ে ভিন্ন হতে পারে, একই ডেটার জন্য ভিন্ন হ্যাশ তৈরি করে।SHA-256 ফাইল চেকসাম — ডাউনলোড ও আর্টিফ্যাক্ট যাচাই
একটি ফাইলের SHA-256 চেকসাম গণনা করা অ্যালগরিদমের সবচেয়ে সাধারণ ব্যবহারের একটি। এটি সর্বত্র দেখা যায়: Go বাইনারি, Python wheel ফাইল, Docker ইমেজ ম্যানিফেস্ট, ফার্মওয়্যার আপডেটের রিলিজ পেজ। মূল বিষয় হল একসাথে সব লোড না করে খণ্ডে ফাইল পড়া — একটি ২ GB ISO ইমেজ হ্যাশ করতে কেবল ২ GB RAM লাগার কথা নয়।
import hashlib
def sha256_checksum(filepath: str, chunk_size: int = 8192) -> str:
"""মেমোরি সাশ্রয়ে খণ্ডে পড়ে ফাইলের SHA-256 হ্যাশ গণনা করুন।"""
h = hashlib.sha256()
with open(filepath, "rb") as f:
for chunk in iter(lambda: f.read(chunk_size), b""):
h.update(chunk)
return h.hexdigest()
# একটি রিলিজ আর্টিফ্যাক্ট হ্যাশ করুন
checksum = sha256_checksum("/tmp/release-v4.2.1.tar.gz")
print(f"SHA-256: {checksum}")Python 3.11-এ hashlib.file_digest() যোগ করা হয়েছে যা অভ্যন্তরীণভাবে খণ্ড পড়া করে এবং সমর্থিত প্ল্যাটফর্মে zero-copy অপ্টিমাইজেশন ব্যবহার করতে পারে। 3.11 বা পরবর্তী সংস্করণে থাকলে ম্যানুয়াল লুপের চেয়ে এটি পছন্দ করুন।
import hashlib
with open("/tmp/release-v4.2.1.tar.gz", "rb") as f:
digest = hashlib.file_digest(f, "sha256")
print(digest.hexdigest())পরিচিত চেকসামের বিরুদ্ধে ডাউনলোড করা ফাইল যাচাই
import hashlib
import hmac as hmac_mod # শুধু compare_digest-এর জন্য
def verify_checksum(filepath: str, expected_hex: str) -> bool:
"""ধ্রুবক-সময় তুলনা ব্যবহার করে SHA-256 চেকসাম যাচাই করুন।"""
h = hashlib.sha256()
with open(filepath, "rb") as f:
for chunk in iter(lambda: f.read(8192), b""):
h.update(chunk)
return hmac_mod.compare_digest(h.hexdigest(), expected_hex.lower())
# একটি রিলিজ আর্টিফ্যাক্ট যাচাই করুন
expected = "a8f5f167f44f4964e6c998dee827110c3f1de4d0280c68cba98cf70b4b5157db"
if verify_checksum("/tmp/release-v4.2.1.tar.gz", expected):
print("চেকসাম মিলেছে — ফাইল অক্ষুণ্ণ")
else:
print("চেকসাম অমিল — ফাইল নষ্ট বা পরিবর্তিত হতে পারে")hmac.compare_digest() ব্যবহার করুন, এমনকি যখন গোপন চাবি জড়িত নেই। ধ্রুবক-সময় তুলনা টাইমিং-ভিত্তিক তথ্য ফাঁস রোধ করে। == অপারেটর কার্যকরীভাবে কাজ করে কিন্তু নিরাপত্তা-সংবেদনশীল প্রসঙ্গে নিরাপদ নয়।Base64 এনকোডিং সহ SHA-256
কিছু প্রোটোকল SHA-256 ডাইজেস্ট হেক্সের পরিবর্তে Base64 স্ট্রিং হিসেবে প্রত্যাশা করে। Content-Digest এবং Integrity (ব্রাউজারে Subresource Integrity) এর মতো HTTP হেডার Base64 ব্যবহার করে, এবং JWT স্বাক্ষর Base64url-এনকোড করা। কৌশল হল হেক্স স্ট্রিং নয়, কাঁচা .digest() বাইট Base64-এনকোড করা।
import hashlib
import base64
data = b"integrity check payload"
# সঠিক: কাঁচা বাইটের Base64 (৩২ বাইট → ৪৪ Base64 অক্ষর)
raw_digest = hashlib.sha256(data).digest()
b64_digest = base64.b64encode(raw_digest).decode("ascii")
print(f"sha256-{b64_digest}")
# sha256-<44 characters>
# ভুল: হেক্স স্ট্রিংয়ের Base64 (৬৪ ASCII বাইট → ৮৮ Base64 অক্ষর — দ্বিগুণ আকার)
hex_digest = hashlib.sha256(data).hexdigest()
wrong = base64.b64encode(hex_digest.encode()).decode()
print(f"ভুল দৈর্ঘ্য: {len(wrong)} অক্ষর") # 88 — API যা প্রত্যাশা করে তা নয়.hexdigest() নয়, .digest() কল করুন।hashlib.sha256() রেফারেন্স
SHA-256 হ্যাশ অবজেক্টের কনস্ট্রাক্টর এবং মেথড:
চাবিযুক্ত হ্যাশিংয়ের জন্য hmac.new() প্যারামিটার:
cryptography লাইব্রেরি — বিকল্প SHA-256 API
cryptography প্যাকেজ তার hazmat প্রিমিটিভের মাধ্যমে SHA-256-এর জন্য ভিন্ন API প্রদান করে। যখন শুধু হ্যাশ প্রয়োজন তখন আমি সাধারণত এটি ব্যবহার করি না — hashlib সহজ এবং কোনো বাহ্যিক নির্ভরতা নেই। কিন্তু আপনার প্রকল্প যদি TLS, X.509 বা সিমেট্রিক এনক্রিপশনের জন্য ইতিমধ্যে cryptography ব্যবহার করে, তাহলে এর হ্যাশ API ব্যবহার সব কিছু একটি লাইব্রেরিতে রাখে এবং সামঞ্জস্যপূর্ণ ত্রুটি পরিচালনা দেয়।
from cryptography.hazmat.primitives import hashes from cryptography.hazmat.backends import default_backend digest = hashes.Hash(hashes.SHA256(), backend=default_backend()) digest.update(b"deployment-v4.2.1") result = digest.finalize() # কাঁচা ৩২ বাইট print(result.hex()) # 64-char hex string # a8f5f167f44f4964e6c998dee827110c3f1de4d0280c68cba98cf70b4b5157db
cryptography লাইব্রেরির জন্য pip install cryptography প্রয়োজন। হ্যাশ অবজেক্ট একবারের জন্য: দ্বিতীয়বার .finalize() কল করলে AlreadyFinalized উত্থাপিত হয়। হ্যাশ অবস্থা শাখা করতে হলে চূড়ান্ত করার আগে .copy() ব্যবহার করুন।ফাইল ও API প্রতিক্রিয়া থেকে ডেটা হ্যাশ করা
দুটি পরিস্থিতি সবসময় আসে: রিলিজ আর্টিফ্যাক্ট যাচাইয়ের জন্য ডিস্কে থাকা ফাইল হ্যাশ করা, এবং ক্যাশ কী হিসেবে ব্যবহার বা ওয়েবহুক যাচাইয়ের জন্য HTTP প্রতিক্রিয়া বডি হ্যাশ করা।
ফাইল পড়া → SHA-256 গণনা → তুলনা
import hashlib
import sys
def hash_file_safe(filepath: str) -> str | None:
"""সঠিক ত্রুটি পরিচালনা সহ একটি ফাইল হ্যাশ করুন।"""
try:
h = hashlib.sha256()
with open(filepath, "rb") as f:
for chunk in iter(lambda: f.read(16384), b""):
h.update(chunk)
return h.hexdigest()
except FileNotFoundError:
print(f"ত্রুটি: {filepath} পাওয়া যায়নি", file=sys.stderr)
return None
except PermissionError:
print(f"ত্রুটি: {filepath}-এর জন্য পড়ার অনুমতি নেই", file=sys.stderr)
return None
result = hash_file_safe("/etc/nginx/nginx.conf")
if result:
print(f"SHA-256: {result}")HTTP প্রতিক্রিয়া → ক্যাশ কী-র জন্য বডি হ্যাশ
import hashlib
import urllib.request
import json
def fetch_and_hash(url: str) -> tuple[dict, str]:
"""API থেকে JSON আনুন এবং ডেটা ও SHA-256 হ্যাশ উভয় ফেরত দিন।"""
try:
with urllib.request.urlopen(url, timeout=10) as resp:
body = resp.read()
content_hash = hashlib.sha256(body).hexdigest()
data = json.loads(body)
return data, content_hash
except urllib.error.URLError as exc:
raise ConnectionError(f"{url} আনতে ব্যর্থ: {exc}") from exc
# প্রতিক্রিয়া বিষয়বস্তুর উপর ভিত্তিক ক্যাশ কী
data, digest = fetch_and_hash("https://api.exchange.internal/v2/rates")
print(f"প্রতিক্রিয়া হ্যাশ: {digest[:16]}...")
print(f"EUR/USD: {data.get('rates', {}).get('EUR', 'N/A')}")দ্রুত একবারের পরীক্ষার জন্য, ToolDeck-এর SHA-256 জেনারেটর সম্পূর্ণ ব্রাউজারে চলে — কোনো কোড প্রয়োজন নেই।
কমান্ড-লাইন SHA-256 হ্যাশিং
কখনো কখনো ইনসিডেন্ট বা ডিপ্লয়মেন্টের সময় টার্মিনালে দ্রুত হ্যাশ প্রয়োজন। Python-এর hashlib মডিউলে কোনো অন্তর্নির্মিত CLI সাবকমান্ড নেই (python3 -m json.tool এর বিপরীতে), কিন্তু একটি ওয়ান-লাইনার বা সিস্টেম টুল ব্যবহার করা যায়।
# Python ওয়ান-লাইনার echo -n "deployment-v4.2.1" | python3 -c "import hashlib,sys; print(hashlib.sha256(sys.stdin.buffer.read()).hexdigest())" # macOS / BSD echo -n "deployment-v4.2.1" | shasum -a 256 # Linux (coreutils) echo -n "deployment-v4.2.1" | sha256sum # OpenSSL (ক্রস-প্ল্যাটফর্ম) echo -n "deployment-v4.2.1" | openssl dgst -sha256
# একটি রিলিজ tarball হ্যাশ করুন sha256sum release-v4.2.1.tar.gz # অথবা openssl dgst -sha256 release-v4.2.1.tar.gz # পরিচিত চেকসামের বিরুদ্ধে যাচাই করুন echo "a8f5f167f44f4964e6c998dee827110c release-v4.2.1.tar.gz" | sha256sum -c - # release-v4.2.1.tar.gz: OK
echo -n (কোনো পরিশেষ নিউলাইন নেই) ব্যবহার করুন। সাদা echo \n যোগ করে, যা হ্যাশ পরিবর্তন করে। Python এবং শেলের মধ্যে ভিন্ন হ্যাশ পাওয়ার এটি সবচেয়ে সাধারণ কারণ।উচ্চ-কার্যক্ষমতার বিকল্প — OpenSSL ও pycryptodome সহ hashlib
CPython-এ, hashlib.sha256() ইতিমধ্যে OpenSSL-এর C বাস্তবায়ন ব্যবহার করে, তাই এটি দ্রুত — আধুনিক হার্ডওয়্যারে সাধারণত ৫০০+ MB/s।
যদি SHA-256 হ্যাশিং আপনার প্রোফাইলারে দেখা যায় — ধরুন আপনি CI পাইপলাইনে হাজার হাজার ফাইলের চেকসাম গণনা করছেন বা উচ্চ-থ্রুপুট API গেটওয়েতে প্রতিটি অনুরোধের বডি হ্যাশ করছেন — দুটি বিকল্প আছে: hashlib কলিং প্যাটার্ন অপ্টিমাইজ করুন, অথবা SHA-3 এবং BLAKE2 কভার করা একীভূত ক্রিপ্টো API-এর জন্য pycryptodome ব্যবহার করুন:
pip install pycryptodome
from Crypto.Hash import SHA256 h = SHA256.new() h.update(b"deployment-v4.2.1") print(h.hexdigest()) # a8f5f167f44f4964e6c998dee827110c3f1de4d0280c68cba98cf70b4b5157db
উচ্চ-থ্রুপুট সমান্তরাল ফাইল হ্যাশিংয়ের জন্য, বড় চাংক আকার এবং থ্রেডিংয়ের মাধ্যমে Python ওভারহেড কমিয়ে বেশি লাভ হয়:
import hashlib
import os
from pathlib import Path
from concurrent.futures import ThreadPoolExecutor
def hash_file(path: Path) -> tuple[str, str]:
"""একটি ফাইল হ্যাশ করুন এবং (path, hex digest) ফেরত দিন।"""
h = hashlib.sha256()
with open(path, "rb") as f:
for chunk in iter(lambda: f.read(65536), b""): # 64 KB চাংক
h.update(chunk)
return str(path), h.hexdigest()
def hash_directory(directory: str, pattern: str = "*.tar.gz") -> dict[str, str]:
"""থ্রেড ব্যবহার করে সমান্তরালে সব মিলে যাওয়া ফাইল হ্যাশ করুন।"""
files = list(Path(directory).glob(pattern))
results = {}
with ThreadPoolExecutor(max_workers=os.cpu_count()) as pool:
for path, digest in pool.map(hash_file, files):
results[path] = digest
return results
# সমান্তরালে সব রিলিজ আর্টিফ্যাক্ট হ্যাশ করুন
checksums = hash_directory("/var/releases", "*.tar.gz")
for path, digest in checksums.items():
print(f"{digest} {path}")৮ KB-এর পরিবর্তে ৬৪ KB চাংক ব্যবহার করলে Python-থেকে-C কলের সংখ্যা ৮ গুণ কমে। C-স্তর হ্যাশিংয়ের সময় GIL মুক্ত হওয়ায় থ্রেড এখানে ভালো কাজ করে — বাধা CPU নয়, ডিস্ক I/O।
সিনট্যাক্স হাইলাইটিং সহ টার্মিনাল আউটপুট
rich লাইব্রেরি উপযোগী যখন আপনাকে একগুচ্ছ ফাইল যাচাই করতে হয় এবং কাঁচা হেক্স আউটপুটের পরিবর্তে ফাইল প্রতি পাস/ফেল স্ট্যাটাস দেখানো একটি টেবিল চান।
pip install rich
import hashlib
from pathlib import Path
from rich.console import Console
from rich.table import Table
console = Console()
def hash_and_display(files: list[str], expected: dict[str, str]) -> None:
"""ফাইল হ্যাশ করুন এবং রঙ-কোড করা যাচাইয়ের ফলাফল প্রদর্শন করুন।"""
table = Table(title="SHA-256 যাচাই")
table.add_column("ফাইল", style="cyan")
table.add_column("SHA-256", style="dim", max_width=20)
table.add_column("স্ট্যাটাস")
for filepath in files:
h = hashlib.sha256()
with open(filepath, "rb") as f:
for chunk in iter(lambda: f.read(8192), b""):
h.update(chunk)
digest = h.hexdigest()
name = Path(filepath).name
status = "[green]✓ ঠিক আছে[/green]" if expected.get(name) == digest else "[red]✗ অমিল[/red]"
table.add_row(name, f"{digest[:16]}...", status)
console.print(table)
# ব্যবহার
expected_checksums = {
"api-gateway-v3.1.tar.gz": "a8f5f167f44f4964...",
"worker-v3.1.tar.gz": "7d3f8c2a1b9e4f5d...",
}
hash_and_display(
["/var/releases/api-gateway-v3.1.tar.gz", "/var/releases/worker-v3.1.tar.gz"],
expected_checksums,
)console.print(data, highlight=False) দিয়ে সেগুলো বাদ দিন অথবা Console(file=open(...)) দিয়ে ফাইলে পুনর্নির্দেশ করুন।বড় ফাইল নিয়ে কাজ করা
খণ্ডিত .update() প্যাটার্ন যেকোনো আকারের ফাইল ধ্রুবক মেমোরি ব্যবহারে পরিচালনা করে। খুব বড় ফাইলের (মাল্টি-GB ডিস্ক ইমেজ, ডেটাবেস ব্যাকআপ) জন্য মূল উদ্বেগ মেমোরি থেকে ব্যবহারকারীর প্রতিক্রিয়ায় সরে যায় — ৫০০ MB/s গতিতে ১০ GB হ্যাশ করতে ২০ সেকেন্ড লাগে, এবং সেই সময়ে নীরবতা মানুষকে উদ্বিগ্ন করে।
import hashlib
import os
def sha256_with_progress(filepath: str) -> str:
"""stderr-এ অগ্রগতি রিপোর্ট সহ একটি বড় ফাইল হ্যাশ করুন।"""
file_size = os.path.getsize(filepath)
h = hashlib.sha256()
bytes_read = 0
with open(filepath, "rb") as f:
while chunk := f.read(1 << 20): # 1 MB চাংক
h.update(chunk)
bytes_read += len(chunk)
pct = (bytes_read / file_size) * 100
print(f"\r হ্যাশিং: {pct:.1f}% ({bytes_read >> 20} MB / {file_size >> 20} MB)",
end="", flush=True)
print() # অগ্রগতির পরে নিউলাইন
return h.hexdigest()
digest = sha256_with_progress("/mnt/backups/db-snapshot-2026-03.sql.gz")
print(f"SHA-256: {digest}")NDJSON / JSON Lines — প্রতিটি রেকর্ড আলাদাভাবে হ্যাশ
import hashlib
import json
def hash_ndjson_records(filepath: str) -> dict[str, str]:
"""নকল সনাক্তকরণের জন্য NDJSON ফাইলের প্রতিটি JSON রেকর্ড হ্যাশ করুন।"""
seen = {}
with open(filepath, "r", encoding="utf-8") as f:
for line_num, line in enumerate(f, 1):
line = line.strip()
if not line:
continue
try:
record = json.loads(line)
# হ্যাশ করার আগে স্বাভাবিক করুন: নির্ধারিত আউটপুটের জন্য চাবি বাছাই
canonical = json.dumps(record, sort_keys=True, separators=(",", ":"))
digest = hashlib.sha256(canonical.encode("utf-8")).hexdigest()
if digest in seen:
print(f"লাইন {line_num}: লাইন {seen[digest]}-এর নকল")
else:
seen[digest] = line_num
except json.JSONDecodeError:
print(f"লাইন {line_num}: অবৈধ JSON, বাদ দেওয়া হয়েছে")
print(f"{line_num} লাইন প্রক্রিয়া করা হয়েছে, {len(seen)} অনন্য রেকর্ড")
return seen
hash_ndjson_records("telemetry-events-2026-03.ndjson")hashlib.sha256(data) ওয়ান-শট থেকে খণ্ডিত .update() লুপে স্যুইচ করুন। সেই সীমার নিচে, f.read() দিয়ে পুরো ফাইল পড়া ঠিক আছে — মেমোরি ব্যবহার মোটামুটি ফাইলের আকারের সমান হবে।সাধারণ ভুল
সমস্যা: hashlib.sha256('text') TypeError উত্থাপন করে: হ্যাশ করার আগে Unicode অবজেক্ট এনকোড করতে হবে। ফাংশনের জন্য str নয়, bytes প্রয়োজন।
সমাধান: আগে স্ট্রিং এনকোড করুন: hashlib.sha256('text'.encode('utf-8'))। হার্ডকোড করা মানের জন্য b'' লিটারেল ব্যবহার করুন।
import hashlib
digest = hashlib.sha256("deployment-v4.2.1").hexdigest()
# TypeError: Unicode-objects must be encoded before hashingimport hashlib
digest = hashlib.sha256("deployment-v4.2.1".encode("utf-8")).hexdigest()
# কাজ করে — 64-char hex string ফেরত দেয়সমস্যা: == অপারেটর প্রথম অমিল বাইটেই সংক্ষিপ্ত হয়। আক্রমণকারী প্রতিক্রিয়ার সময় পরিমাপ করে সঠিক স্বাক্ষর একটি বাইট একটি করে অনুমান করতে পারে।
সমাধান: সব নিরাপত্তা-সংবেদনশীল তুলনায় hmac.compare_digest() ব্যবহার করুন — এটি অমিল যেখানেই হোক ধ্রুবক সময়ে চলে।
received_sig = request.headers["X-Signature"]
expected_sig = hmac.new(key, body, hashlib.sha256).hexdigest()
if received_sig == expected_sig: # টাইমিং আক্রমণের ঝুঁকি
process_webhook(body)received_sig = request.headers["X-Signature"]
expected_sig = hmac.new(key, body, hashlib.sha256).hexdigest()
if hmac.compare_digest(received_sig, expected_sig): # ধ্রুবক-সময়
process_webhook(body)সমস্যা: base64.b64encode(digest.hexdigest().encode()) ৮৮-অক্ষরের স্ট্রিং তৈরি করে — প্রত্যাশিত ৪৪ অক্ষরের দ্বিগুণ। Base64-এনকোড করা SHA-256 প্রত্যাশী API এটি প্রত্যাখ্যান করবে।
সমাধান: .hexdigest() (হেক্স স্ট্রিং) নয়, Base64-এনকোডিংয়ের আগে .digest() (কাঁচা বাইট) কল করুন।
import hashlib, base64 hex_str = hashlib.sha256(data).hexdigest() b64 = base64.b64encode(hex_str.encode()) # 88 chars — ভুল!
import hashlib, base64 raw = hashlib.sha256(data).digest() b64 = base64.b64encode(raw) # 44 chars — সঠিক
সমস্যা: hashlib.sha256(open('large.iso', 'rb').read()) পুরো ফাইল মেমোরিতে লোড করে। কেবল হ্যাশ গণনার জন্য একটি 4 GB ফাইলের 4 GB RAM প্রয়োজন।
সমাধান: একটি লুপ ও .update() দিয়ে খণ্ডে পড়ুন। ফাইলের আকার নির্বিশেষে মেমোরি ব্যবহার ধ্রুবক থাকে।
import hashlib
# পুরো 4 GB ফাইল মেমোরিতে লোড করে
digest = hashlib.sha256(open("disk.iso", "rb").read()).hexdigest()import hashlib
h = hashlib.sha256()
with open("disk.iso", "rb") as f:
for chunk in iter(lambda: f.read(8192), b""):
h.update(chunk)
digest = h.hexdigest() # ধ্রুবক মেমোরি ব্যবহারhashlib বনাম hmac বনাম বিকল্প — দ্রুত তুলনা
সরল হ্যাশিংয়ের জন্য — চেকসাম, ক্যাশ কী, বিষয়বস্তু ফিঙ্গারপ্রিন্টিং — hashlib.sha256() ব্যবহার করুন। গোপন চাবি প্রয়োজন হলেই hmac.new() ব্যবহার করুন (ওয়েবহুক, API স্বাক্ষর, টোকেন প্রমাণীকরণ)। এনক্রিপশন বা TLS-এর জন্য আপনার প্রকল্প ইতিমধ্যে cryptography ব্যবহার করলেই কেবল সেটি ব্যবহার করুন — হ্যাশিংয়ের জন্যই একটি C এক্সটেনশন নির্ভরতা যোগ করা অতিরিক্ত যখন hashlib ইতিমধ্যে OpenSSL-চালিত।
SHA-256 কি ডিক্রিপ্ট করা যায়? — হ্যাশিং বনাম এনক্রিপশন
সংক্ষিপ্ত উত্তর: না। SHA-256 একটি একমুখী ফাংশন। অ্যালগরিদম অপরিবর্তনীয় হতে ডিজাইন করা হয়েছে — আপনি ২৫৬-বিট ডাইজেস্ট থেকে মূল ইনপুট পুনর্গঠন করতে পারবেন না। এটি বাস্তবায়নের সীমাবদ্ধতা নয়; এটি হ্যাশ ফাংশনের একটি গাণিতিক বৈশিষ্ট্য। ২৫৬-বিট আউটপুট স্থান অবিশ্বাস্যরকম বড় (২২৫৬ সম্ভাব্য মান), এবং ফাংশন তার ৬৪টি সংকোচন রাউন্ডে তথ্য বাদ দেয়।
আক্রমণকারীরা দুর্বল ইনপুটের (সাধারণ পাসওয়ার্ড, ছোট স্ট্রিং) বিরুদ্ধে ব্রুট-ফোর্স বা অভিধান আক্রমণ করতে পারে, কিন্তু যথেষ্ট এনট্রপি সহ যেকোনো ইনপুটের জন্য — API কী, এলোমেলো টোকেন, ফাইলের বিষয়বস্তু — বর্তমান হার্ডওয়্যারে SHA-256 বিপরীত করা গণনাগতভাবে অসম্ভব। যদি বিপরীতযোগ্য রূপান্তর প্রয়োজন হয়, সিমেট্রিক এনক্রিপশন ব্যবহার করুন:
# হ্যাশিং — একমুখী, মূল পুনরুদ্ধার করা যায় না import hashlib digest = hashlib.sha256(b"secret-config-value").hexdigest() # digest থেকে "secret-config-value" ফিরে পাওয়ার কোনো উপায় নেই # এনক্রিপশন — দ্বিমুখী, চাবি দিয়ে ডিক্রিপ্ট করা যায় from cryptography.fernet import Fernet key = Fernet.generate_key() cipher = Fernet(key) encrypted = cipher.encrypt(b"secret-config-value") decrypted = cipher.decrypt(encrypted) print(decrypted) # b"secret-config-value" — মূল পুনরুদ্ধার হয়েছে
ইনস্টল ছাড়াই দ্রুত SHA-256 হ্যাশ তৈরি করতে, অনলাইন টুলটি সম্পূর্ণ ব্রাউজারে চলে।
Python-এ একটি স্ট্রিং বৈধ SHA-256 হ্যাশ কিনা কীভাবে পরীক্ষা করবেন
একটি বৈধ SHA-256 হেক্স ডাইজেস্ট ঠিক ৬৪টি হেক্সাডেসিমাল অক্ষর (0-9, a-f, A-F)। অবিশ্বস্ত ইনপুট প্রক্রিয়া করার আগে দ্রুত যাচাই বিভ্রান্তিকর ডাউনস্ট্রিম ত্রুটি রোধ করে।
import re
def is_sha256_hex(value: str) -> bool:
"""একটি স্ট্রিং SHA-256 হেক্স ডাইজেস্ট ফরম্যাটের সাথে মিলে কিনা পরীক্ষা করুন।"""
return bool(re.fullmatch(r"[a-fA-F0-9]{64}", value))
# পরীক্ষার ক্ষেত্র
print(is_sha256_hex("e3b0c44298fc1c149afbf4c8996fb924"
"27ae41e4649b934ca495991b7852b855")) # True — খালি স্ট্রিংয়ের SHA-256
print(is_sha256_hex("e3b0c44298fc1c14")) # False — অনেক ছোট
print(is_sha256_hex("zzzz" * 16)) # False — অবৈধ হেক্স অক্ষরসচরাচর জিজ্ঞাসিত প্রশ্ন
Python-এ SHA-256 দিয়ে একটি স্ট্রিং কীভাবে হ্যাশ করব?
স্ট্রিংটি বাইটে এনকোড করে hashlib.sha256() কল করুন। Python-এর স্ট্রিং ইউনিকোড, এবং হ্যাশ ফাংশন কাঁচা বাইটে কাজ করে, তাই আগে .encode("utf-8") কল করতে হবে। .hexdigest() মেথড পরিচিত ৬৪-অক্ষরের হেক্স স্ট্রিং ফেরত দেয়।
import hashlib
api_key = "sk_live_9f3a7b2e1d4c"
digest = hashlib.sha256(api_key.encode("utf-8")).hexdigest()
print(digest)
# e3b7c4a1f8d2...64 hex charactersSHA-256 হ্যাশ থেকে মূল টেক্সট পুনরুদ্ধার করা কি সম্ভব?
না। SHA-256 একটি একমুখী ফাংশন — এটি যেকোনো দৈর্ঘ্যের ইনপুটকে নির্দিষ্ট ২৫৬-বিট আউটপুটে রূপান্তরিত করে এবং প্রক্রিয়ায় তথ্য মুছে দেয়। কোনো গাণিতিক বিপরীত নেই। আক্রমণকারীরা দুর্বল ইনপুটের (ছোট পাসওয়ার্ড, সাধারণ শব্দ) বিরুদ্ধে ব্রুট-ফোর্স বা রেইনবো টেবিল অনুসন্ধান করতে পারে, কিন্তু যথেষ্ট এনট্রপি সহ যেকোনো ইনপুটের জন্য SHA-256 বিপরীত করা গণনাগতভাবে অসম্ভব। যদি বিপরীতযোগ্য রূপান্তর প্রয়োজন হয়, হ্যাশিংয়ের পরিবর্তে এনক্রিপশন (AES-GCM, Fernet) ব্যবহার করুন।
.digest() এবং .hexdigest()-এর মধ্যে পার্থক্য কী?
.digest() হ্যাশের কাঁচা ৩২ বাইট bytes অবজেক্ট হিসেবে ফেরত দেয়। .hexdigest() একই ডেটা ৬৪-অক্ষরের ছোট হাতের হেক্সাডেসিমাল স্ট্রিং হিসেবে এনকোড করে ফেরত দেয়। HMAC-এ প্রবেশ করানো, Base64 এনকোডিং বা বাইনারি প্রোটোকলে লেখার সময় .digest() ব্যবহার করুন। লগিং, ডেটাবেস সংরক্ষণ বা চেকসাম তুলনার জন্য .hexdigest() ব্যবহার করুন।
import hashlib h = hashlib.sha256(b"deployment-v4.2.1") print(len(h.digest())) # 32 (bytes) print(len(h.hexdigest())) # 64 (hex characters)
Python-এ একটি ফাইলের SHA-256 চেকসাম কীভাবে গণনা করব?
ফাইলটি বাইনারি মোডে খুলুন এবং .update() দিয়ে খণ্ডে খণ্ডে হ্যাশারে প্রবেশ করান। Python 3.11+-এ আরও সহজ API-এর জন্য hashlib.file_digest() ব্যবহার করুন। বড় ফাইলে f.read() কখনো কল করবেন না — এটি পুরো ফাইল মেমোরিতে লোড করে।
import hashlib
def sha256_file(path: str) -> str:
h = hashlib.sha256()
with open(path, "rb") as f:
for chunk in iter(lambda: f.read(8192), b""):
h.update(chunk)
return h.hexdigest()
print(sha256_file("release-v4.2.1.tar.gz"))Python-এ HMAC-SHA256 স্বাক্ষর কীভাবে তৈরি করব?
digestmod হিসেবে hashlib.sha256 সহ hmac মডিউল ব্যবহার করুন। গোপন চাবি এবং বার্তা bytes হিসেবে পাস করুন। ফলাফল একটি চাবিযুক্ত হ্যাশ যা সততা এবং প্রামাণিকতা উভয়ই প্রমাণ করে — প্রাপককে যাচাই করতে একই চাবি প্রয়োজন।
import hmac
import hashlib
secret = b"webhook_secret_9f3a"
payload = b'{"event":"payment.completed","amount":4999}'
signature = hmac.new(secret, payload, hashlib.sha256).hexdigest()
print(signature) # 64-char hex HMACএকটি স্ট্রিং বৈধ SHA-256 হেক্স ডাইজেস্ট কিনা কীভাবে যাচাই করব?
SHA-256 হেক্স ডাইজেস্ট ঠিক ৬৪টি হেক্সাডেসিমাল অক্ষর। রেজেক্স বা সরল দৈর্ঘ্য + অক্ষর পরীক্ষা ব্যবহার করুন। রেজেক্স পদ্ধতিটি সবচেয়ে পাঠযোগ্য।
import re
def is_sha256(s: str) -> bool:
return bool(re.fullmatch(r"[a-fA-F0-9]{64}", s))
print(is_sha256("e3b0c44298fc1c149afbf4c8996fb924"
"27ae41e4649b934ca495991b7852b855")) # True
print(is_sha256("not-a-hash")) # Falseসম্পর্কিত টুল
Dmitri is a DevOps engineer who relies on Python as his primary scripting and automation language. He builds internal tooling, CI/CD pipelines, and infrastructure automation scripts that run in production across distributed teams. He writes about the Python standard library, subprocess management, file processing, encoding utilities, and the practical shell-adjacent Python that DevOps engineers use every day.
Maria is a backend developer specialising in Python and API integration. She has broad experience with data pipelines, serialisation formats, and building reliable server-side services. She is an active member of the Python community and enjoys writing practical, example-driven guides that help developers solve real problems without unnecessary theory.