在PHP中,可以使用openssl扩展来实现AES/ECB/PKCS7Padding解密。我们需要自己实现PKCS7Padding和PKCS7Unpadding,因为openssl_encrypt和openssl_decrypt函数默认不使用PKCS7Padding。
php与java的rsa加密互通问题
近在整接口对接;对方用的是java,里面用到了RSA加密模式,我用php写,结果不行,发过去以后,对方表示无法解密
去官网看了下openssl_private_encrypt的OPENSSL_NO_PADDING形式;
For a 1024 bit key length => encrypted number of raw bytes is always a block of 128 bytes (1024 bits) by RSA design.
For a 2048 bit key length => encrypted number of raw bytes is always a block of 256 bytes (2048 bits) by RSA design.
然后就手动填充了ASCII 0;补全256字节就解决了
$Str = str_pad($Str, 256, “\0”, STR_PAD_LEFT);
java中的多线程
有关概念:
进程:进程指正在运行的程序。确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能。
线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。
一个程序运行后至少有一个进程,一个进程中可以包含多个线程
Java设计模式——单例模式
- 单例类只能有一个实例。
- 单例类必须自己创建自己的唯一实例。
- 单例类必须给所有其他对象提供这一实例。
//这种方法是线程不安全的,如果并发则会创建多个对象 class SinglePattern{ private static SinglePattern instance ; //1.构造方法私有化 private SinglePattern() { } //2.提供一个全局访问点 public static SinglePattern getInstance() { if(instance == null) { instance = new SinglePattern(); } return instance; } }
多线程有一个锁机制。使用synchronized修饰。我们可以锁住获取对象的方法。代码如下:
/** * 加锁后的,单例模式类 * @author wanghao * */ class SinglePattern{ private static SinglePattern instance ; //1.构造方法私有化 private SinglePattern() { } //2.提供一个全局访问点 加锁后 public static synchronized SinglePattern getInstance() { if(instance == null) { instance = new SinglePattern(); } return instance; } }
众所周知线程安全就等于效率会相对低点。所有经过改造优化,出现另一种双重判断方式。代码如下:
/** * 加锁后的,单例模式类 +优化后 * @author wanghao * */ class SinglePattern{ private static SinglePattern instance ; //1.构造方法私有化 private SinglePattern() { } //2.提供一个全局访问点 加锁后 public static SinglePattern getInstance() { if(instance == null) { synchronized(SinglePattern.class) { if(instance == null) { instance = new SinglePattern(); } } } return instance; } }
单例模式重点就一个对象,这样理论上会是创建次数少获取的次数多。所以,我们只需加锁创建对象的方式,而判断是否为null,可以不加锁。可以提高效率。
如果按前面一种方式,如果高并发10个线程同时访问,则需要耗费10*(等待时间+判断时间),
而如果用第二张方式,如果通用10个线程访问,则只需10*(判断时间),如果没有对象则再加上一次判断时间和创建对象的时间。