在資料庫中,我有使用默認配置的 Java Jasypt 庫在后端加密的用戶電子郵件。據我了解,它使用 PBEWITHMD5andDES 和 1000 次迭代來生成密鑰。
@Bean
StringEncryptor encryptor() {
StandardPBEStringEncryptor spbe = new StandardPBEStringEncryptor();
spbe.setPassword(symmetricKey);
return spbe;
}
然后加密器使用如下:
@Before("insertAccount(account)")
public void beforeInsertAccount(Account account) {
account.setFirstName(encryptor.encrypt(StringUtils.defaultString(account.getFirstName())));
account.setPhone(encryptor.encrypt(StringUtils.defaultString(account.getPhone())));
account.setEmail(encryptor.encrypt(StringUtils.defaultString(account.getEmail())));
}
在 AWS Glue(ETL 工具)中,我需要解密用戶的電子郵件,或者至少匹配來自兩個不同表的加密電子郵件。我可以通過創建 Python3 腳本來定義自定義轉換。
我基于此撰寫了一個腳本:https : //gist.github.com/jpralves/505e653fd1c7358ad2c540e25e1ee80a 它使用的是 pycryptodome 庫。data_to_decrypt 變數使用密碼 'test' 使用 jasypt 加密的 '[email protected]' 進行初始化。
def MyTransform (glueContext, dfc) -> DynamicFrameCollection:
from Crypto.Hash import MD5
from Crypto.Cipher import DES
import base64
import sys
from pyspark.sql.functions import lit
newdf = dfc.select(list(dfc.keys())[0]).toDF()
data_to_decrypt = base64.b64decode("epncHsHYRZd8uIWncULit//8f0mhk8pn")
password = "test"
bs = 8
_iterations = 1000
salt = data_to_decrypt[:bs]
data = data_to_decrypt[bs:]
hasher = MD5.new()
result = hasher.digest()
hasher.update(bytearray(password.encode()))
hasher.update(bytearray(salt))
for i in range(1, _iterations):
hasher = MD5.new()
hasher.update(result)
result = hasher.digest()
encoder = DES.new(result[:bs], DES.MODE_CBC, result[bs:bs*2])
decrypted = encoder.decrypt(bytes(data))
length = len(decrypted)
unpadding = int(decrypted[length-1])
decryptedEmail = ''
if length - unpadding > 0:
decryptedEmail = decrypted[:(length - unpadding)].decode("latin")
else:
decryptedEmail = decrypted.decode("latin")
newdf = newdf.withColumn('decryptedEmail', lit(decryptedEmail))
dyf_filtered = DynamicFrame.fromDF(newdf, glueContext, "aaa")
return(DynamicFrameCollection({"CustomTransform0": dyf_filtered}, glueContext))
腳本正在輸出一些廢話,例如“'€ ?>— |?8T?e?7e”。當我嘗試以任何其他編碼解碼來自編碼器的輸出字串時,它失敗了。
uj5u.com熱心網友回復:
您的實際問題是您的第一個哈希是錯誤的;你需要在做完這兩個s.digest 后服用。.update(您的迭代哈希是正確的。)此外,您的未填充很差:PKCS5 填充不應超過一個塊,對于 DES 為 8 個位元組。如果大于 1,更好的方法是檢查所有填充位元組,但我沒有打擾。
$ cat 71576901.py3
from Crypto.Hash import MD5
from Crypto.Cipher import DES
import base64
data_to_decrypt = base64.b64decode("epncHsHYRZd8uIWncULit//8f0mhk8pn")
password = "test"
bs = 8
_iterations = 1000
salt = data_to_decrypt[:bs]
data = data_to_decrypt[bs:]
hasher = MD5.new()
hasher.update(bytearray(password.encode()))
hasher.update(bytearray(salt))
result = hasher.digest() # moved down
for i in range(1, _iterations):
hasher = MD5.new()
hasher.update(result)
result = hasher.digest()
encoder = DES.new(result[:bs], DES.MODE_CBC, result[bs:bs*2])
decrypted = encoder.decrypt(bytes(data))
length = len(decrypted)
unpadding = int(decrypted[length-1])
if unpadding > 0 and unpadding <= bs: # better check
print (decrypted[:-unpadding].decode('latin1')) # or other decoding depending on what you encrypted
else:
print ('bad') # might better raise, but TBD
$ python3 71576901.py3
[email protected]
請確保您知道,這是一個非常弱的加密并且很容易被破解——但這是一個安全問題,而不是編程,而且這里是題外話。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/447472.html
標籤:python-3.x 亚马逊网络服务 加密 aws胶水
