摘要:首先安裝確認(rèn)安裝的是版本版本的是不一樣的生成公私鑰對(duì)生成私鑰同時(shí)包含公鑰此處為序列化公鑰私鑰并寫入文件存儲(chǔ)序列化私鑰無(wú)密碼也可以加入密碼保護(hù)私鑰將私鑰寫入文件將公鑰寫入文件也可以采用其他序列化方法比如對(duì)公鑰生成格式的序列化字符串輸出類似于
首先 安裝cryptography
sudo pip3 install cryptography
確認(rèn)安裝的是2.1.x版本 (1.x版本的api是不一樣的).
生成公私鑰對(duì):
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 # 生成私鑰 (同時(shí)包含公鑰), 此處為RSA 2048 private_key = rsa.generate_private_key( public_exponent=65537, key_size=2048, backend=default_backend() )
序列化公鑰 私鑰, 并寫入文件存儲(chǔ).
# 序列化私鑰 pem = private_key.private_bytes( encoding=serialization.Encoding.PEM, format=serialization.PrivateFormat.PKCS8, # 無(wú)密碼 encryption_algorithm=serialization.NoEncryption() # 也可以加入密碼保護(hù)私鑰: # 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)
也可以采用其他序列化方法, 比如對(duì)公鑰, 生成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"
此后可以從文件讀出公鑰(私鑰)
# 從文件讀出并創(chuàng)建公鑰 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() )
對(duì)于openSSH格式, 應(yīng)采用load_ssh_public_key
給指定消息加簽, 獲得簽名
# 需要加簽的消息 message = b"A message I want to sign" # 對(duì)消息加簽, 獲得簽名, 為bytes signature = private_key.sign( message, padding.PSS( mgf=padding.MGF1(hashes.SHA1()), salt_length=padding.PSS.MAX_LENGTH ), hashes.SHA1() ) # 需要傳輸, 展示, 存儲(chǔ)時(shí), 可以將簽名轉(zhuǎn)為base64格式的bytes, # 也可以繼續(xù)轉(zhuǎn)為str: str(enc_sig, "utf-8") enc_sig = b64encode(signature)
驗(yàn)證簽名:
# 通過signature, 公鑰 給 消息message 驗(yàn)簽, 驗(yàn)證是由私鑰持有者發(fā)出的這條消息. # 如果驗(yàn)簽通過, 則正常通過, 否則, 拋出 cryptography.exceptions.InvalidSignature 異常 public_key.verify( signature, message, padding.PSS( mgf=padding.MGF1(hashes.SHA1()), salt_length=padding.PSS.MAX_LENGTH ), hashes.SHA1() )
這樣生成的簽名base64encode之后, 會(huì)有344byte 的長(zhǎng)度.
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/41266.html
摘要:在與第三方服務(wù)對(duì)接時(shí),加密與解密,加簽與驗(yàn)簽是這個(gè)過程中的關(guān)鍵一步一般情況下,對(duì)接服務(wù)中會(huì)有兩對(duì)公私鑰。傳回來(lái)的數(shù)據(jù),使用自己的私鑰解密,使用對(duì)方的公鑰驗(yàn)簽。加密加密超長(zhǎng)字節(jié)個(gè)字節(jié)一加密解密解密超長(zhǎng)字符一解密加簽驗(yàn)簽簽名待驗(yàn)證簽名 在與第三方服務(wù)對(duì)接時(shí),加密與解密,加簽與驗(yàn)簽是這個(gè)過程中的關(guān)鍵一步 一般情況下,對(duì)接服務(wù)中會(huì)有兩對(duì)公私鑰。使用對(duì)方公鑰進(jìn)行加密,使用自己私鑰進(jìn)行加簽。傳回來(lái)...
摘要:錢可以存儲(chǔ)在自己的余額中,這就相當(dāng)于微信錢包,余額可以提現(xiàn)到銀行卡的中。我們的第三方支付平臺(tái)是連連支付,杭州的一家公司。私鑰怎么加簽每個(gè)公司的加簽方式是不一樣的,支付寶有支付寶的加簽方式,微信有微信的加簽方式。 導(dǎo)讀 筆者在校期間,通過自學(xué)java。學(xué)校里也開過這門課,但是,講的都是一些基礎(chǔ),比如java的表達(dá)式、基本類型、自定義類型等等。也都是很基礎(chǔ)的東西,就連lambda表達(dá)式都沒...
摘要:工商銀行中國(guó)工商銀行提現(xiàn)支付域名項(xiàng)目名接口我們第一次使用支付請(qǐng)求對(duì)象,是為了將其生成簽名原串。第一次加密是將不包含屬性值的支付請(qǐng)求對(duì)象封裝的簽名原串和我們生成的私鑰共同加密成簽名字符串,放進(jìn)支付請(qǐng)求對(duì)象中的屬性中。 引題 【備注】簽名原串的源碼放在git上了,請(qǐng)大家參看:項(xiàng)目源碼 筆者最近在做支付、調(diào)用天貓優(yōu)惠券、綁定銀行卡相關(guān)的業(yè)務(wù),在這些業(yè)務(wù)中,我們都需要將數(shù)據(jù)加密。然而,數(shù)據(jù)的加...
摘要:基于注解生成加簽驗(yàn)簽。后來(lái)發(fā)現(xiàn)如下的問題有些字段太大,不想?yún)⑴c驗(yàn)簽,但是無(wú)法方便的調(diào)整。感覺這樣有很大的弊端,完全失去了靈活性。 checksum 基于 java 注解生成加簽驗(yàn)簽 checksum。 開源地址:github checksum 創(chuàng)作緣由 原來(lái)的代碼中,checksum 的生成是用的工具類方法。 后來(lái)發(fā)現(xiàn)如下的問題: 有些字段太大,不想?yún)⑴c驗(yàn)簽,但是無(wú)法方便的調(diào)整。 ...
摘要:加解密中必須考慮到的密鑰長(zhǎng)度明文長(zhǎng)度和密文長(zhǎng)度問題。而只要用到,那么就要占用實(shí)際的明文長(zhǎng)度,于是實(shí)際明文長(zhǎng)度需要減去字節(jié)長(zhǎng)度。所以如果要對(duì)任意長(zhǎng)度的數(shù)據(jù)進(jìn)行加密,就需要將數(shù)據(jù)分段后進(jìn)行逐一加密,并將結(jié)果進(jìn)行拼接。 RSA加解密中必須考慮到的密鑰長(zhǎng)度、明文長(zhǎng)度和密文長(zhǎng)度問題。明文長(zhǎng)度需要小于密鑰長(zhǎng)度,而密文長(zhǎng)度則等于密鑰長(zhǎng)度。因此當(dāng)加密內(nèi)容長(zhǎng)度大于密鑰長(zhǎng)度時(shí),有效的RSA加解密就需要對(duì)內(nèi)...
閱讀 1803·2023-04-25 15:51
閱讀 2512·2021-10-13 09:40
閱讀 2145·2021-09-23 11:22
閱讀 3253·2019-08-30 14:16
閱讀 2667·2019-08-26 13:35
閱讀 1862·2019-08-26 13:31
閱讀 885·2019-08-26 11:39
閱讀 2746·2019-08-26 10:33