1. ホーム
  2. パイソン

python3におけるdigest()とhexdigest()の違いについて

2022-03-02 23:50:50

python3におけるdigest()とhexdigest()の相違点

hashlib は安全なハッシュ化とメッセージのダイジェスト化に関与し、 SHA1, SHA224, SHA256, SHA384, SHA512, MD5 など、いくつかの異なる暗号化アルゴリズムへのインタフェースを提供します。

ここで

hash.digest()



ダイジェストをバイナリデータ文字列の値として返します。

hash.hexdigest()



ダイジェストを16進数のデータ文字列値として返します。

例として

import hashlib

md5 = hashlib.md5()
md5.update("a".encode('utf-8'))
print(u"digest returned summary: %s"% md5.digest())
print(u"digest returned by hexdigest: %s"% md5.hexdigest())

結果

Digest returned digest: b'\x0c\xc1u\xb9\xc0\xf1\xb6\xa81\xc3\x99\xe2iw&a'
Summary returned by hexdigest: 0cc175b9c0f1b6a831c399e269772661

import hashlib
import base64

md5 = hashlib.md5()


a = "<request><waybills><waybill><receiver><receiverName>ZhangSan</receiverName>< receiverMobile>13000000000</receiverMobile><receiverZip>431400</receiverZip><receiverProvince>Gansu Province</ receiverProvince><receiverCity>Lanzhou</receiverCity><receiverArea>Xinzhou District</receiverArea><receiverDistrict& gt;Liji Street</receiverDistrict><receiverAddress>No.222 South Tianshui Road</receiverAddress></receiver><sender><shopName >TmallSupermarket</shopName><senderName>TmallSupermarketWarehouse</senderName><senderPhone>02781739210</senderPhone>< senderZip>430208</senderZip><senderProvince>Gansu Province</senderProvince><senderCity>Lanzhou</senderCity>< senderArea>Xinzhou District</senderArea><senderAddress>Jinkou Street Xuguang Village CaiBird Logistics Park No. 3 library</senderAddress></sender><packageInfo>< ;packageCode>test0926001</packageCode><isExpensive>false</isExpensive><weight>2302</weight>< volume>7888000</volume><length>290</length><width>170</width><height>160</height>< storeOutTime>2017-09-22 08:55:04</storeOutTime></packageInfo><carrier/><sortingInfo><routetype>1& lt;/routetype><storeCode>pressureTest</storeCode><deliveryCode>CHENGBANGPEISONG-0001</deliveryCode>< deliveryWlbCode>NJCB-001</deliveryWlbCode><cpSimplyCode>C</cpSimplyCode><citySimplyCode>H1</ citySimplyCode><routePath>{'nextRouteId':890,'nextRouteType':2,'targerRdcType':2,'targetRdcId':890}</routePath>< siteId>4859</siteId><siteCode>1619095</siteCode><carrierCode>CBWL</carrierCode>< sortingRequireTimes><requireSendTime>2017-09-24 23:59:00</requireSendTime></sortingRequireTimes>< sortingService><expressSerType>108</expressSerType></sortingService></sortingInfo><order>< lgOrderSource>WLB</lgOrderSource><storeOrderCode>ydhtest1341573</storeOrderCode><logisticsId> LP00079477100697</logisticsId><mailNo>ddhtest5454253</mailNo><customerCode>SB-ZFB</customerCode>< deliveryType>1</deliveryType><distributionType>1</distributionType></order><deliveryNodeInfo>< nodeCode>1619095</nodeCode><nodeName>Shengbang Hubei Distribution Center</nodeName><deliveryStatus>MainWaybillAccess</ deliveryStatus><firstOwnerRdcCode>1619095</firstOwnerRdcCode></deliveryNodeInfo><uniqueCode> MainWaybillAccesstest09260012017-09-22 09:13:11</uniqueCode><remark>zpb_chuyan_cb</remark></waybill></ waybills></request>"
b = a.replace("\\\>\\s+\\\\<", "><")+"alog"


md5.update(b.encode('utf-8'))
b = md5.digest()
print(u"16-bit md5 encryption result: %s"% b)
print(u"16-bit md5 encryption result then base64 encoding: %s" % base64.b64encode(b).decode('utf-8')
)

クラウドマッチングインターフェースの暗号化ルールをjavaで実装し、pythonに変換したものです。

暗号化ルール リクエストメッセージ 2. リクエストメッセージ内の文字列を置換 (replace("\s+Gt;\s+Lt;", "><")) 3. 置換後の文字列 + キー ('alog') 

4. 手順 3 で得られた文字列を md5 で暗号化 5. 暗号化された文字列を base64 で符号化

暗号化のPython実装

16-bit md5 encryption result: b'(\xb1\xf9\xd9\xf4\x90\x90jN;\n~\x82)FF'
16-bit md5 encryption result then base64 encoding: KLH52fSQkGpOOwp+gilGRg==


 結果

hash.digest()

暗号化結果はjavaの実装と一致しています

注意 区別された暗号は hash.digest()  またはhash.hexdigest()で、以前にhexdigestメソッドを使用していたため、不正な暗号化結果になっていたことがある