【问题标题】:Unable to perform Encryption using Fernet-Java in Android Studio无法在 Android Studio 中使用 Fernet-Java 执行加密
【发布时间】:2020-07-16 16:16:43
【问题描述】:

Fernet 加密是我的客户要求。

我有 Fernet 密钥,想通过 https://github.com/l0s/fernet-java8 这个链接在 Java(Android Studio) 中实现加密。 从上周开始工作,但直到现在还没有实现,任何人都可以帮助我解决这个问题。?

没有引入任何方法来执行加密

final Key key = new Key("3t55GSk5qDRUif_v4MNQGLrkzaWv-TFOSJpqQWj9KKg=");
final Token token = Token.generate(key, "This is my message");

如 Fernet 文档中所述,我在 build.gradle 中添加了依赖项

implementation 'com.macasaet.fernet:fernet-java8:1.4.2'

【问题讨论】:

    标签: java android encryption cryptography fernet


    【解决方案1】:

    以下代码是使用 Fernet Java 8 进行字符串加密的最小示例,没有适当的错误处理g,我也没有检查什么加密算法模式或密钥长度正在使用中。

    要加密更复杂的数据结构,请参考https://github.com/l0s/fernet-java8

    在第一个加密/解密部分中,会生成一个新的密钥并生成一个新的令牌。此令牌的(默认)持续时间为 60 秒,可以更改。解密立即完成,因此不会过期。

    第二次解密需要一个旧令牌(来自 GitHub readme.md),当您尝试解密时收到“TokenExpiredException”。

    控制台:

    key: j2v_wwTtEanOKF4-OqXtJ8ECi9UGOD72uGuJLJqZUuE=
    token: gAAAAABfEJkmA7qy6voW6-xZMz4wYqcies156jEBXbqkk585aerDwKRlQAuFOkSv94Ac503WSk222ayQMvPmweDp9IRakq3mBMrBY7zyRt9ou5luqpTXs8HDWvCjpJ0y66-hboULhyut
    token timestamp: 2020-07-16T18:15:02.456832100Z
    decryptedtext: this is my data that needs encryption
    token2 timestamp: 1985-10-26T08:20:00Z
    Exception in thread "main" com.macasaet.fernet.TokenExpiredException: Token is expired
        at com.macasaet.fernet.Token.validateAndDecrypt(Token.java:250)
        at com.macasaet.fernet.Validator.validateAndDecrypt(Validator.java:104)
        at com.macasaet.fernet.Token.validateAndDecrypt(Token.java:228)
        at Unable_to_perform_Encryption_using_Fernet_Java.Main.main(Main.java:27)
    

    代码:

    import com.macasaet.fernet.Key;
    import com.macasaet.fernet.StringValidator;
    import com.macasaet.fernet.Token;
    import com.macasaet.fernet.Validator;
    // get Fernet_Java here: https://mvnrepository.com/artifact/com.macasaet.fernet/fernet-java8
    // version used: 1.42
    public class Main {
        static final Validator<String> validator = new StringValidator() {
        };
        public static void main(String[] args) {
            System.out.println("https://stackoverflow.com/questions/62939044/unable-to-perform-encryption-using-fernet-java-in-android-studio\n");
            // generate a key
            Key key = Key.generateKey();
            System.out.println("key: " + key.serialise());
            // encrypt
            String plaintext = "this is my data that needs encryption";
            Token token = Token.generate(key, plaintext);
            System.out.println("token: " + token.serialise());
            // decrypt
            System.out.println("token timestamp: " + token.getTimestamp());
            String decryptedtext = token.validateAndDecrypt(key, validator);
            System.out.println("decryptedtext: " + decryptedtext);
            // old token
            Token token2 = Token.fromString("gAAAAAAdwJ6wAAECAwQFBgcICQoLDA0ODy021cpGVWKZ_eEwCGM4BLLF_5CV9dOPmrhuVUPgJobwOz7JcbmrR64jVmpU4IwqDA==");
            System.out.println("token2 timestamp: " + token2.getTimestamp());
            String decryptedtext2 = token2.validateAndDecrypt(key, validator);
            System.out.println("decryptedtext2: " + decryptedtext2);
        }
    }
    

    【讨论】:

    • 我遵循相同但令牌是数据的加密形式..??
    • 是的,但令牌还包含一个时间戳,因此该令牌仅在 60 秒内有效。考虑登录到 Web 服务 - 令牌将保存在您的浏览器历史记录中,但是当您稍后尝试登录时,60 秒后登录将失败。如果您觉得我的回答有帮助,请将其标记为已接受,谢谢。
    • 坚持这一点。有什么方法可以解密数据吗? :(
    • @Rohit TP:问题是关于加密,而不是解密。如果您坚持这一点,请提出您自己的问题,添加您正在努力解决的代码并添加示例数据集(明文、密钥、密文),谢谢。
    猜你喜欢
    • 2021-02-15
    • 1970-01-01
    • 1970-01-01
    • 2022-12-30
    • 2016-11-14
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多