php的openssl_encrypt改写成java版

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: php的openssl_encrypt改写成java版

需求


我们之前的服务是php的,然后接下来的新功能打算用java开发,php的功能也打算后续迁移过来,然后数据库里的手机号是加密过的,所以java这边也需要按照相同的规则去加解密,下面就是过程


实现


php


先看下原来的php代码


    public static function encryptNew($plaintext)
    {
    //加密模式选择的AES-128-ECB,注意128表示密钥应该是16位的,16x8=128
        $cipher = 'AES-128-ECB';
        //此处是密钥
        $key = ENCRYPT_KEY;
        //此处进行AES-128-ECB加密
        $ciphertext_raw = openssl_encrypt($plaintext, $cipher, $key, OPENSSL_RAW_DATA);
        //得到AES-128-ECB的加密结果,继续进行sha256加密
        $hmac = hash_hmac('sha256', $ciphertext_raw, $key, true);
        //将两个加密串拼起来进行base64,得到最终结果
        $ciphertext = base64_encode($hmac . $ciphertext_raw);
        return $ciphertext;
    }


此处需要注意两点:


  1. AES-128-ECB的密钥是16位


  1. AES-128-ECB是不需要iv的


java


然后看一下对应的java代码,java用的是hutool包来做的加解密,pom引用如下:


        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.7.22</version>
        </dependency>


接下来展示代码:


    /**
     * 加密啊
     * @param str 要加密的字符串
     * phpkey就是密钥=ENCRYPT_KEY的前16位
     * @return
     */
    public static String phpEcbEncryptHex(String str) {
        AES aes = new AES(Mode.ECB, Padding.PKCS5Padding, phpkey);
        byte[] encrypted = aes.encrypt(str);
        byte[] hash= new byte[0];
        try {
            hash = macSHA256(encrypted);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        }
        byte[] data3 = new byte[encrypted.length + hash.length];
        System.arraycopy(hash, 0, data3, 0, hash.length);
        System.arraycopy(encrypted, 0, data3, hash.length, encrypted.length);
        String base64Str3 = Base64.encode(data3);
        System.out.println("base 64 is "+base64Str3);
        return base64Str3;
    }
    /**
     * sha256加密
     * @param encrypted
     * @return mackey是加密的密钥=ENCRYPT_KEY
     * @throws NoSuchAlgorithmException
     * @throws InvalidKeyException
     */
    private static byte[] macSHA256(byte[] encrypted ) throws NoSuchAlgorithmException, InvalidKeyException {
        Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
        SecretKeySpec secret_key = new SecretKeySpec(mackey, "HmacSHA256");
        sha256_HMAC.init(secret_key);
        //String hash = byteArrayToHexString(sha256_HMAC.doFinal(encrypted));// 重点
        byte[] hash = sha256_HMAC.doFinal(encrypted);// 重点
        System.out.println("hash is "+hash);
        return hash;
    }


遇到的问题


改写还是比较容易的,改完了之后跑了个测试发现,加密出来的结果不一样,这就搞笑了。

最终发现原因,php的使用的是32位长的密钥,但是PHP的openssl_encrypt方法,指定完method,也就是指定完加密模式之后,会直接使用对应长度的密钥,也就是就算提供的是32位的密钥,它只会使用前16位,仍然会进行AES-128-ECB加密。


而java这边,可以看到,只需要指定ECB模式,那么128还是256,是通过你使用的密钥长度来选择的,也就是说,当提供的密钥是32位时,就会进行256的加密。


目录
相关文章
|
6月前
|
安全 Java 编译器
深入理解PHP 8.0新特性及其对开发的影响Java中的多线程编程:从理论到实践
【5月更文挑战第27天】在这篇文章中,我们将详细探讨PHP 8.0的新特性以及它们如何影响开发者的工作流程。我们将深入研究这些新特性,包括JIT编译器,联合类型,命名参数,以及更多的错误处理机制。我们还将讨论这些新特性如何提高代码的可读性和性能,以及它们如何改变我们编写和维护PHP应用程序的方式。 【5月更文挑战第27天】在现代计算机科学中,多线程编程是一个重要的概念,它允许多个线程在同一时间内运行,从而提高了程序的效率和性能。本文将深入探讨Java中的多线程编程,包括其理论基础,实现方法,以及一些常见的问题和解决方案。我们将通过实例来理解如何创建和管理线程,以及如何使用Java的并发工具来
ly~
|
2月前
|
安全 Java 大数据
php跟java有什么区别
PHP 和 Java 是两种常用编程语言,各有特色。PHP 语法简洁灵活,适用于快速开发中小型网站,尤其在 Web 脚本和数据库交互中表现出色。Java 则语法严谨,强类型特性使其在企业级应用、移动开发及大数据处理中更受欢迎,具备高稳定性和安全性。通过优化,PHP 性能可提升,而 Java 在大规模应用中表现更佳。总体而言,PHP 开发效率高但维护性稍差,Java 则更注重代码质量和安全性。
ly~
45 5
|
2月前
|
Java 开发者
【Java编程新纪元】JDK 22:超级构造函数来袭,super(...) 前导语句改写编程规则!
【9月更文挑战第6天】JDK 22的超级构造函数特性是Java编程语言发展史上的一个重要里程碑。它不仅简化了代码编写,还提升了代码的可读性和维护性。我们有理由相信,在未来的Java版本中,还将有更多令人兴奋的新特性等待我们去发现和应用。让我们共同期待Java编程新纪元的到来!
|
3月前
|
Java 应用服务中间件 PHP
PHP——调用java文件中的方法
PHP——调用java文件中的方法
56 0
PHP——调用java文件中的方法
|
3月前
|
Java PHP 开发者
PHP中的异常处理:Java常见的编码方式
在PHP开发中,掌握异常处理至关重要,它有助于预见并管理运行时错误,避免用户体验受损或数据丢失。本文介绍PHP异常处理的基本概念与实践,包括try-catch语句的使用,以及如何通过抛出和捕获异常来增强代码的健壮性和可靠性。通过示例展示如何避免常见错误,如除数为零的情况,并探讨多catch块和finally语句的高级用法,帮助开发者提升程序稳定性与可维护性。[总字符数:238]
29 0
|
5月前
|
Java PHP 数据安全/隐私保护
php和Java配合 aes
php和Java配合 aes加密
43 1
|
4月前
|
Java 应用服务中间件 测试技术
PHP和Java在性能上的差异有哪些?
【7月更文挑战第2天】PHP和Java在性能上的差异有哪些?
205 0
|
4月前
|
Java 测试技术 数据库连接
PHP和Java哪个更难?
【7月更文挑战第2天】PHP和Java哪个更难?
52 0
php案例:判断这个文件是什么编程语言代码的文件(判断java或者php)
php案例:判断这个文件是什么编程语言代码的文件(判断java或者php)
php案例:判断这个文件是什么编程语言代码的文件(判断java或者php)
|
6月前
|
Java API PHP
多多关键字API php java Python
多多关键字API接口广泛应用于商家进行市场分析、竞品分析、关键词优化等场景。商家可以通过分析关键词数据,了解用户需求,制定针对性的营销策略,提高产品的曝光率和转化率。