用Fernet在Java上进行对称加密

时间:2019-07-10 02:04:33

标签: java python security encryption

我想使用Fernet模块对python和java之间的消息进行加密和解密。但是我不明白他们给的例子。

反序列化现有密钥:

final Key key = new Key("cw_0x689RpI-jtRR7oE8h_eQsKImvJapLeSbXpwF4e4=");

创建令牌:

final Token token = Token.generate(random, key, "secret message");

反序列化现有令牌:

final Token token = Token.fromString("gAAAAAAdwJ6wAAECAwQFBgcICQoLDA0ODy021cpGVWKZ_eEwCGM4BLLF_5CV9dOPmrhuVUPgJobwOz7JcbmrR64jVmpU4IwqDA==");

为什么需要一个随机参数来加密秘密消息?我已经在python中实现了fermet加密,它从未要求任何随机性来源。

>>> from cryptography.fernet import Fernet
>>> key = Fernet.generate_key()
>>> f = Fernet(key)
>>> token = f.encrypt(b"my deep dark secret")
>>> token
b'...'
>>> f.decrypt(token)
b'my deep dark secret

如何获得与python中相同的加密标准,以便可以使用相同的加密密钥?

1 个答案:

答案 0 :(得分:0)

使用相同的键,Python和Java中的实现将完全兼容。但是,当然双方都必须使用相同的一方。如果您使用Python代码作为基础代码,请执行print(key)并将相同的密钥复制到Java变体(它将是urlsafebase64字符串,因此不会出现传输问题)。在Java中,生成令牌时,请使用SecureRandom()实例。它仅用于IV,并且无论如何都是令牌的一部分,因此可以使用任何语言的解密代码。 Fernet Python自动使用良好的随机性(它是透明的,您不必选择它)。但是,无论您在Java中生成令牌时在Java中选择哪种随机选择,都不会对解密代码产生任何影响,只是在两种情况下都使用相同的密钥字符串即可。