Python में SHA-256 हैशिंग — hashlib गाइड
मुफ़्त SHA-256 हैश जनरेटर को सीधे अपने ब्राउज़र में उपयोग करें — इंस्टॉलेशन की ज़रूरत नहीं।
SHA-256 हैश जनरेटर ऑनलाइन आज़माएं →मैंने जितने भी डिप्लॉयमेंट पाइपलाइन बनाए हैं, उनमें अंततः फ़ाइल चेकसम सत्यापित करने, webhook पेलोड पर हस्ताक्षर करने, या कैश कुंजी को फ़िंगरप्रिंट करने की आवश्यकता पड़ी है। Python SHA-256 हैशिंग अंतर्निर्मित hashlib मॉड्यूल के साथ इन सभी मामलों को संभालती है — और यह पहले से इंस्टॉल है। hashlib.sha256() CPython पर OpenSSL की C-level implementation use करता है, इसलिए यह तेज़ और FIPS-compliant है। बिना कोई कोड लिखे त्वरित एकबारगी हैश के लिए, ऑनलाइन 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) किसी भी लंबाई का इनपुट लेकर fixed 256-bit (32-byte) डाइजेस्ट उत्पन्न करता है। समान इनपुट हमेशा समान आउटपुट देता है, लेकिन इनपुट में एक भी बिट परिवर्तन से पूर्णतः भिन्न हैश उत्पन्न होता है — इस गुण को एवलांच प्रभाव कहते हैं। SHA-256, SHA-2 परिवार का हिस्सा है, NIST द्वारा मानकीकृत है, और TLS प्रमाणपत्र फ़िंगरप्रिंट, Git कमिट ID, Bitcoin ब्लॉक हेडर, और फ़ाइल अखंडता सत्यापन की आधारशिला है। एल्गोरिदम 256-बिट आउटपुट उत्पन्न करने के लिए 64 संपीड़न चक्रों के साथ Merkle-Damgård संरचना का उपयोग करता है।
deployment-v4.2.1
a1f7c3d8e9b2...27ae41e4649b (64 hex chars)
ऊपर दिया हेक्स डाइजेस्ट मानक प्रतिनिधित्व है — 64 हेक्साडेसिमल वर्ण, चाहे आप एक बाइट हैश करें या पूरी डिस्क छवि, लंबाई हमेशा समान रहती है।
hashlib.sha256() — मानक लाइब्रेरी दृष्टिकोण
hashlib मॉड्यूल हर Python इंस्टॉलेशन के साथ आता है — pip install की कोई आवश्यकता नहीं। हैश ऑब्जेक्ट बनाने के लिए hashlib.sha256() को bytes तर्क के साथ कॉल करें, फिर .hexdigest() (हेक्स स्ट्रिंग) या .digest() (कच्चे बाइट्स) से परिणाम प्राप्त करें। फ़ंक्शन का नाम लोअरकेस है: sha256, न कि SHA256।
import hashlib # बाइट स्ट्रिंग को सीधे हैश करें digest = hashlib.sha256(b"deployment-v4.2.1").hexdigest() print(digest) # a8f5f167f44f4964e6c998dee827110c3f1de4d0280c68cba98cf70b4b5157db
hashlib.sha256() के साथ सबसे सामान्य गलती bytes के बजाय str पास करना है। Python स्ट्रिंग Unicode हैं, और हैश फ़ंक्शन कच्चे बाइट्स पर कार्य करते हैं। हैश करने से पहले आपको .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() कच्चे 32 बाइट्स लौटाता है। .hexdigest() 64-वर्ण का हेक्स स्ट्रिंग लौटाता है। HMAC, Base64 एन्कोडिंग, या बाइनरी प्रोटोकॉल में परिणाम फ़ीड करते समय .digest() का उपयोग करें। लॉगिंग, डेटाबेस कॉलम, और चेकसम तुलना के लिए .hexdigest() का उपयोग करें।HMAC-SHA256 — hmac मॉड्यूल के साथ कुंजी-युक्त हैशिंग
SHA-256 अकेले में गोपनीय कुंजी की कोई अवधारणा नहीं है — समान इनपुट वाला कोई भी व्यक्ति समान हैश निकाल सकता है। यदि आपको यह सिद्ध करना है कि संदेश किसी विशेष प्रेषक से आया है (webhook सत्यापन, API अनुरोध हस्ताक्षर, टोकन प्रमाणीकरण), तो HMAC की आवश्यकता है। hmac मॉड्यूल Python की stdlib का हिस्सा है और कुंजी को हैशिंग में शामिल करता है — सिर्फ वही डाइजेस्ट बना या verify कर सकता है जिसके पास वही कुंजी हो।
import hmac
import hashlib
# Webhook हस्ताक्षर सत्यापन
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:
"""स्थिर-समय तुलना का उपयोग करके webhook हस्ताक्षर सत्यापित करें।"""
expected = hmac.new(secret, payload, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, received_sig)
# Stripe-शैली webhook सत्यापन का अनुकरण
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 webhooks सभी इस पैटर्न के भिन्न रूप उपयोग करते हैं।
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, विभिन्न पेमेंट गेटवे) HMAC परिणाम को हेक्स के बजाय Base64-एन्कोडेड स्ट्रिंग के रूप में अपेक्षित करते हैं। अंतर यह है: हेक्स 64 वर्ण उपयोग करता है, Base64 उसी 32-बाइट डाइजेस्ट के लिए 44 वर्ण उपयोग करता है।
import hmac
import hashlib
import base64
secret = b"webhook_secret_9f3a"
message = b"POST /api/v2/events 1741614120"
# हेक्स आउटपुट: 64 वर्ण
hex_sig = hmac.new(secret, message, hashlib.sha256).hexdigest()
print(f"Hex: {hex_sig}")
# Base64 आउटपुट: 44 वर्ण (छोटा, 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 कच्चे बाइट्स पर कार्य करता है, इसलिए गैर-bytes प्रकार — datetime, UUID, dataclasses, Pydantic मॉडल — को हैश करने से पहले बाइट्स में क्रमबद्ध करना होगा। कोई स्वचालित रूपांतरण नहीं है; आप कैनोनिकल प्रतिनिधित्व चुनते हैं। सिस्टम के बीच निर्धारक हैशिंग के लिए, हमेशा स्पष्ट एन्कोडिंग और स्थिर क्रमिकता प्रारूप उपयोग करें (datetimes के लिए ISO 8601, UUIDs के लिए मानक स्ट्रिंग रूप, dicts के लिए sorted-key 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-जैसे ऑब्जेक्ट के लिए sorted keys के साथ 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:
"""निर्धारकता के लिए sorted-key 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)। Dict insertion order Python 3.7+ में preserve होता है, लेकिन अलग-अलग जगहों से serialize करने पर order बदल सकता है — जिससे same data का अलग हैश निकलता है।SHA-256 फ़ाइल चेकसम — डाउनलोड और आर्टिफैक्ट सत्यापित करें
फ़ाइल का SHA-256 चेकसम निकालना एल्गोरिदम के सबसे सामान्य उपयोगों में से एक है। यह हर जगह दिखता है: Go बाइनरी के रिलीज़ पेज, Python wheel फ़ाइलें, Docker छवि मैनिफेस्ट, फ़र्मवेयर अपडेट। मुख्य बात यह है कि फ़ाइल को एक बार में लोड करने के बजाय खंडों में पढ़ें — 2 GB की ISO छवि को हैश करने के लिए 2 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 (32 bytes → 44 Base64 वर्ण)
raw_digest = hashlib.sha256(data).digest()
b64_digest = base64.b64encode(raw_digest).decode("ascii")
print(f"sha256-{b64_digest}")
# sha256-<44 characters>
# गलत: हेक्स स्ट्रिंग का Base64 (64 ASCII bytes → 88 Base64 वर्ण — दोगुना आकार)
hex_digest = hashlib.sha256(data).hexdigest()
wrong = base64.b64encode(hex_digest.encode()).decode()
print(f"गलत लंबाई: {len(wrong)} वर्ण") # 88 — API अपेक्षित नहीं.digest() कॉल करें, .hexdigest() नहीं।hashlib.sha256() संदर्भ
SHA-256 हैश ऑब्जेक्ट पर कन्स्ट्रक्टर और मेथड:
कुंजी-युक्त हैशिंग के लिए hmac.new() पैरामीटर:
cryptography लाइब्रेरी — SHA-256 का वैकल्पिक API
cryptography पैकेज अपने hazmat primitives के माध्यम से SHA-256 के लिए एक भिन्न API प्रदान करता है। जब केवल हैश की आवश्यकता हो तो मैं इसका उपयोग शायद ही करता हूं — hashlib सरल है और इसकी कोई बाहरी निर्भरता नहीं है। लेकिन यदि आपका प्रोजेक्ट पहले से cryptography पर TLS, X.509, या सममित एन्क्रिप्शन के लिए निर्भर है, तो इसके हैश 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() # कच्चे 32 bytes print(result.hex()) # 64-char hex string # a8f5f167f44f4964e6c998dee827110c3f1de4d0280c68cba98cf70b4b5157db
cryptography लाइब्रेरी के लिए pip install cryptography आवश्यक है। हैश ऑब्जेक्ट एकल-उपयोग है: .finalize() दूसरी बार कॉल करने पर AlreadyFinalized त्रुटि उत्पन्न होती है। यदि आपको हैश स्थिति को अलग करने की ज़रूरत है तो finalize से पहले .copy() उपयोग करें।फ़ाइल और API प्रतिक्रिया से डेटा हैश करना
दो परिदृश्य बार-बार आते हैं: रिलीज़ आर्टिफैक्ट सत्यापित करने के लिए डिस्क पर फ़ाइल हैश करना, और कैश कुंजी के रूप में उपयोग करने या webhook सत्यापन के लिए 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"Response hash: {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-level implementation use करता है, इसलिए यह fast है — आधुनिक hardware पर आमतौर पर 500+ MB/s।
यदि SHA-256 हैशिंग आपके प्रोफ़ाइलर में दिखती है — मान लीजिए आप CI पाइपलाइन में हज़ारों फ़ाइलों के चेकसम निकाल रहे हैं या उच्च-थ्रूपुट API गेटवे में हर अनुरोध बॉडी हैश कर रहे हैं — तो दो विकल्प हैं: hashlib कॉलिंग पैटर्न अनुकूलित करें, या SHA-3 और BLAKE2 भी कवर करने वाले एकीकृत crypto 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}")8 KB के बजाय 64 KB खंड उपयोग करने से Python-से-C कॉल की संख्या 8 गुना कम होती है। थ्रेड यहां अच्छा काम करते हैं क्योंकि 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 Verification")
table.add_column("File", style="cyan")
table.add_column("SHA-256", style="dim", max_width=20)
table.add_column("Status")
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]✓ OK[/green]" if expected.get(name) == digest else "[red]✗ MISMATCH[/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 डिस्क छवियां, डेटाबेस बैकअप) के लिए, मुख्य चिंता मेमोरी से उपयोगकर्ता प्रतिक्रिया पर स्थानांतरित हो जाती है — 500 MB/s पर 10 GB हैश करने में अभी भी 20 सेकंड लगते हैं, और उस दौरान चुप्पी लोगों को चिंतित करती है।
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)
# हैश करने से पहले सामान्यीकृत करें: निर्धारक आउटपुट के लिए keys क्रमबद्ध करें
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-objects को एन्कोड करना होगा। फ़ंक्शन को str नहीं बल्कि bytes चाहिए।
समाधान: पहले स्ट्रिंग एन्कोड करें: hashlib.sha256('text'.encode('utf-8'))। या हार्डकोडेड मानों के लिए b'' literal उपयोग करें।
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()) 88-वर्ण की स्ट्रिंग उत्पन्न करता है — अपेक्षित 44 वर्ण से दोगुना। Base64-एन्कोडेड SHA-256 की अपेक्षा रखने वाले API इसे अस्वीकार कर देंगे।
समाधान: Base64-एन्कोडिंग से पहले .digest() (कच्चे bytes) कॉल करें, .hexdigest() (hex string) नहीं।
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() से काम चलाएं। जब गोपनीय कुंजी की आवश्यकता हो (webhooks, API हस्ताक्षर, टोकन प्रमाणीकरण) तो hmac.new() पर स्विच करें। cryptography लाइब्रेरी केवल तभी उपयोग करें जब आपका प्रोजेक्ट पहले से एन्क्रिप्शन या TLS के लिए इस पर निर्भर है — जब hashlib पहले से OpenSSL द्वारा समर्थित है, तो केवल हैशिंग के लिए C एक्सटेंशन निर्भरता जोड़ना अनावश्यक है।
क्या SHA-256 को डिक्रिप्ट किया जा सकता है? — हैशिंग बनाम एन्क्रिप्शन
संक्षिप्त उत्तर: नहीं। SHA-256 एक एकदिशीय फ़ंक्शन है। एल्गोरिदम अपरिवर्तनीय होने के लिए डिज़ाइन किया गया है — आप 256-बिट डाइजेस्ट से मूल इनपुट पुनर्निर्माण नहीं कर सकते। यह implementation की कमी नहीं है; यह hash function का mathematical property है। 256-बिट आउटपुट स्थान अत्यंत विशाल है (2256 संभावित मान), और फ़ंक्शन अपने 64 संपीड़न चक्रों के दौरान सूचना को त्याग देता है।
आक्रमणकर्ता कमज़ोर इनपुट (सामान्य पासवर्ड, छोटी स्ट्रिंग) के विरुद्ध ब्रूट-फ़ोर्स या शब्दकोश हमलों का प्रयास कर सकते हैं, लेकिन उचित एंट्रॉपी वाले किसी भी इनपुट के लिए — 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 हेक्स डाइजेस्ट ठीक 64 हेक्साडेसिमल वर्णों (0-9, a-f, A-F) का होता है। अविश्वसनीय इनपुट संसाधित करने से पहले त्वरित सत्यापन भ्रामक त्रुटियों को रोकता है।
import re
def is_sha256_hex(value: str) -> bool:
"""जांचें कि क्या कोई स्ट्रिंग SHA-256 hex digest प्रारूप से मेल खाती है।"""
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 — अमान्य hex वर्णअक्सर पूछे जाने वाले प्रश्न
Python में SHA-256 से स्ट्रिंग को कैसे हैश करें?
स्ट्रिंग को बाइट्स में एन्कोड करके hashlib.sha256() कॉल करें। Python में स्ट्रिंग Unicode होती हैं, और हैश फ़ंक्शन कच्चे बाइट्स पर कार्य करते हैं, इसलिए पहले .encode("utf-8") कॉल करना अनिवार्य है। .hexdigest() मेथड 64-वर्ण का परिचित हेक्स स्ट्रिंग लौटाता है।
import hashlib
api_key = "sk_live_9f3a7b2e1d4c"
digest = hashlib.sha256(api_key.encode("utf-8")).hexdigest()
print(digest)
# e3b7c4a1f8d2...64 hex charactersक्या SHA-256 हैश से मूल टेक्स्ट वापस प्राप्त किया जा सकता है?
नहीं। SHA-256 एक one-way फ़ंक्शन है — यह किसी भी लंबाई के इनपुट को fixed 256-bit आउटपुट में बदलता है, और इसे उलटा नहीं किया जा सकता। कोई गणितीय उलटा नहीं है। आक्रमणकर्ता कमज़ोर इनपुट (छोटे पासवर्ड, सामान्य शब्द) के विरुद्ध ब्रूट-फ़ोर्स या रेनबो टेबल खोज का प्रयास कर सकते हैं, लेकिन उचित एंट्रॉपी वाले किसी भी इनपुट के लिए SHA-256 को पलटना व्यावहारिक रूप से असंभव है। यदि आपको उलटा परिवर्तन चाहिए, तो हैशिंग के बजाय एन्क्रिप्शन (AES-GCM, Fernet) का उपयोग करें।
.digest() और .hexdigest() में क्या अंतर है?
.digest() हैश के कच्चे 32 बाइट्स को bytes ऑब्जेक्ट के रूप में लौटाता है। .hexdigest() उसी डेटा को 64-वर्ण के लोअरकेस हेक्साडेसिमल स्ट्रिंग के रूप में एन्कोड करके लौटाता है। .digest() का उपयोग तब करें जब बाइनरी आउटपुट की आवश्यकता हो — HMAC में फ़ीड करने, Base64 एन्कोडिंग, या बाइनरी प्रोटोकॉल में लिखने के लिए। .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 हेक्स डाइजेस्ट ठीक 64 हेक्साडेसिमल वर्णों का होता है। रेगेक्स या सरल लंबाई + वर्ण जांच का उपयोग करें। रेगेक्स दृष्टिकोण सबसे पठनीय है।
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.