摘要:首先安裝確認安裝的是版本版本的是不一樣的生成公私鑰對生成私鑰同時包含公鑰此處為序列化公鑰私鑰并寫入文件存儲序列化私鑰無密碼也可以加入密碼保護私鑰將私鑰寫入文件將公鑰寫入文件也可以采用其他序列化方法比如對公鑰生成格式的序列化字符串輸出類似于
首先 安裝cryptography
sudo pip3 install cryptography
確認安裝的是2.1.x版本 (1.x版本的api是不一樣的).
生成公私鑰對:
from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives.asymmetric import rsa, padding from cryptography.hazmat.primitives import serialization, hashes from base64 import b64encode, b64decode # 生成私鑰 (同時包含公鑰), 此處為RSA 2048 private_key = rsa.generate_private_key( public_exponent=65537, key_size=2048, backend=default_backend() )
序列化公鑰 私鑰, 并寫入文件存儲.
# 序列化私鑰 pem = private_key.private_bytes( encoding=serialization.Encoding.PEM, format=serialization.PrivateFormat.PKCS8, # 無密碼 encryption_algorithm=serialization.NoEncryption() # 也可以加入密碼保護私鑰: # encryption_algorithm=serialization.BestAvailableEncryption(b"mypassword") ) # 將私鑰寫入文件 with open("private.pem", "wb") as f: f.write(pem) public_key = private_key.public_key() pub_pem = public_key.public_bytes( encoding=serialization.Encoding.PEM, format=serialization.PublicFormat.SubjectPublicKeyInfo ) # 將公鑰寫入文件 with open("public.pem", "wb") as f: f.write(pub_pem)
也可以采用其他序列化方法, 比如對公鑰, 生成OpenSSH格式的序列化字符串:
public_key.public_bytes( encoding=serialization.Encoding.OpenSSH, format=serialization.PublicFormat.OpenSSH )
輸出類似于:
b"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCbySUldhJYrDmf8+yyQXMB5HsIMwownZq3ft7k1nei/kVC/720np/1xyk7U8yNc2jL9Yb/pctD/0WAnI7vrkIVQniYfRwiEohDlZHGIvlUpXS4dtKvbOFRDQod9nn4Q9VwfrMq4yuBbKSaCqwcu8rkApWyj36 XhTV5/mT7Zs4H4m3OAyCVD2kkAoZYYbxA+pBNDLDcU4VlUuiC1FaWLTdU5dV6A0IGRGlOuFw4qaJZaFLu6mANaRdX836LA5DOmKpcwerb0ae3eGHZNSLQO6JkIT7oe/I+417jz5JmUI3V35BjKUrd7VjBgbE0jvpkxrzMFCaoOWP0BzTDn+C64fSR"
此后可以從文件讀出公鑰(私鑰)
# 從文件讀出并創建公鑰 with open("public.pem", "rb") as pub_key_file: # 讀入私鑰為 load_pem_private_key public_key = serialization.load_pem_public_key( pub_key_file.read(), # 讀入私鑰此處還有: password=b"xxxx", backend=default_backend() )
對于openSSH格式, 應采用load_ssh_public_key
給指定消息加簽, 獲得簽名
# 需要加簽的消息 message = b"A message I want to sign" # 對消息加簽, 獲得簽名, 為bytes signature = private_key.sign( message, padding.PSS( mgf=padding.MGF1(hashes.SHA1()), salt_length=padding.PSS.MAX_LENGTH ), hashes.SHA1() ) # 需要傳輸, 展示, 存儲時, 可以將簽名轉為base64格式的bytes, # 也可以繼續轉為str: str(enc_sig, "utf-8") enc_sig = b64encode(signature)
驗證簽名:
# 通過signature, 公鑰 給 消息message 驗簽, 驗證是由私鑰持有者發出的這條消息. # 如果驗簽通過, 則正常通過, 否則, 拋出 cryptography.exceptions.InvalidSignature 異常 public_key.verify( signature, message, padding.PSS( mgf=padding.MGF1(hashes.SHA1()), salt_length=padding.PSS.MAX_LENGTH ), hashes.SHA1() )
這樣生成的簽名base64encode之后, 會有344byte 的長度.
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41266.html
摘要:在與第三方服務對接時,加密與解密,加簽與驗簽是這個過程中的關鍵一步一般情況下,對接服務中會有兩對公私鑰。傳回來的數據,使用自己的私鑰解密,使用對方的公鑰驗簽。加密加密超長字節個字節一加密解密解密超長字符一解密加簽驗簽簽名待驗證簽名 在與第三方服務對接時,加密與解密,加簽與驗簽是這個過程中的關鍵一步 一般情況下,對接服務中會有兩對公私鑰。使用對方公鑰進行加密,使用自己私鑰進行加簽。傳回來...
摘要:錢可以存儲在自己的余額中,這就相當于微信錢包,余額可以提現到銀行卡的中。我們的第三方支付平臺是連連支付,杭州的一家公司。私鑰怎么加簽每個公司的加簽方式是不一樣的,支付寶有支付寶的加簽方式,微信有微信的加簽方式。 導讀 筆者在校期間,通過自學java。學校里也開過這門課,但是,講的都是一些基礎,比如java的表達式、基本類型、自定義類型等等。也都是很基礎的東西,就連lambda表達式都沒...
摘要:工商銀行中國工商銀行提現支付域名項目名接口我們第一次使用支付請求對象,是為了將其生成簽名原串。第一次加密是將不包含屬性值的支付請求對象封裝的簽名原串和我們生成的私鑰共同加密成簽名字符串,放進支付請求對象中的屬性中。 引題 【備注】簽名原串的源碼放在git上了,請大家參看:項目源碼 筆者最近在做支付、調用天貓優惠券、綁定銀行卡相關的業務,在這些業務中,我們都需要將數據加密。然而,數據的加...
摘要:基于注解生成加簽驗簽。后來發現如下的問題有些字段太大,不想參與驗簽,但是無法方便的調整。感覺這樣有很大的弊端,完全失去了靈活性。 checksum 基于 java 注解生成加簽驗簽 checksum。 開源地址:github checksum 創作緣由 原來的代碼中,checksum 的生成是用的工具類方法。 后來發現如下的問題: 有些字段太大,不想參與驗簽,但是無法方便的調整。 ...
摘要:加解密中必須考慮到的密鑰長度明文長度和密文長度問題。而只要用到,那么就要占用實際的明文長度,于是實際明文長度需要減去字節長度。所以如果要對任意長度的數據進行加密,就需要將數據分段后進行逐一加密,并將結果進行拼接。 RSA加解密中必須考慮到的密鑰長度、明文長度和密文長度問題。明文長度需要小于密鑰長度,而密文長度則等于密鑰長度。因此當加密內容長度大于密鑰長度時,有效的RSA加解密就需要對內...
閱讀 1784·2023-04-25 15:51
閱讀 2497·2021-10-13 09:40
閱讀 2134·2021-09-23 11:22
閱讀 3244·2019-08-30 14:16
閱讀 2652·2019-08-26 13:35
閱讀 1847·2019-08-26 13:31
閱讀 874·2019-08-26 11:39
閱讀 2732·2019-08-26 10:33