一、Java 环境安装
1.1直接输入java 根据提示进行安装
sudo apt install openjdk-8-jre-headless
ps:踩过的坑:根据其他教程下载java环境包进行安装,启用JavaBridge时java.ext.dirs为null
1.2输入java、javac出现下图即为安装成功
1.3查看版本java -version
二、下载JavaBridge
2.1下载
等待几秒即可自动下载 下载地址(7.2.1)
附上官网点击访问
2.2启动
将其放到/usr/local/src中(位置根据自己需要来放置),进入到目录中开启
java -jar JavaBridge.jar HTTP_LOCAL:8080&
2.3出现下图即为启动成功
2.4此时需要讲招行提供的java包放入到java.ext.dirs所提示的文件夹下
选中的四个即为招行加解密java包
2.5重启
放入文件之后重启JavaBridge
lsof -i:8080
kill -9 xxx
2.6访问
开启成功访问localhost:8080 (这里是用的是curl)
三、在laravel框架中使用加解密
3.1将两个文件放入laravel的public目录
3.2测试
运行cmbdc.php出现一串base64后的字符串即为成功
php cmbdc.php
下面为测试代码,仅供参考
<?php
require_once("Java.inc");
$here=realpath(dirname($_SERVER["SCRIPT_FILENAME"]));
function strToByte($str) {
return array_slice(unpack("C*", "\0".$str), 1);
}
function byteToStr($bytes) {
$str = '';
foreach($bytes as $ch) {
$str .= chr($ch);
}
return $str;
}
echo '<meta charset="UTF-8">';
$privkey = "";//私钥
$id_iv = "";//id
$source = "hello world!"; //utf-8
$cryptor = new Java("dc.demo.DCCryptor");
$signed = $cryptor->CMBSM2SignWithSM3(strToByte($id_iv), base64_decode($privkey), strToByte($source));
print base64_encode($signed)
?>
3.3在laravel中引入Java.inc需要注意:
require_once '你的项目地址/public/Java.inc';
需要绝对地址,否则laravel会报错
Symfony\Component\Debug\Exception\FatalErrorException: main(): Failed opening required 'Java.inc' (include_path='.:/usr/share/php') in /var/www/html/larave/app/Http/Controller/ZSYH/TestController.php:13 Stack trace:
3.4在laravel中使用加解密方法
// 生成签名
$cryptor = new \Java("dc.demo.DCCryptor");
$sign = $cryptor->CMBSM2SignWithSM3('id',base64_decode('私钥'),'内容');//id和内容需要转为Byte
//加密
$encrypt = $cryptor->CMBSM4EncryptWithCBC('SM4秘钥','id',json_encode('内容',JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES));//id和内容需要转为Byte
秘钥:base64_encode($encrypt);
//解密
$decrypt = $cryptor->CMBSM4EncryptWithCBC('SM4秘钥','id',base64_decode('内容'));//id需要转为Byte
解密内容:json_decode(decrypt);
3.5招行demo地址(里面有详细的操作,可供参考)
国密Demo(下载) 查看PHP的内容就可以了
四、总结
一开始搭java环境踩了很多坑,用java包直接安装环境会导致JavaBridge中关键的引用地址为null。所以用Ubuntu的apt安装省去了很多步骤,又能够适配JavaBridge。在laravel中new Java前面要加\,否则会报找不到JAVA类。引用Java.inc时也需要写上绝对路径,不然其他的访问会造成找不到此文件。
mark:在同一类中加密能够正常使用,解密的话会报错,我是新开了一个类来负责解密。希望有大佬能够指点一二,有想法的朋友在评论区讨论下。
local.ERROR: ErrorException: Unchecked exception detected: [[o:Response$UndeclaredThrowableErrorMarker]:"FATAL: Undeclared java.lang.RuntimeException detected. java.lang.Exception: Invoke failed: [[o:JavaBridge]]->offsetGet((o:Object)[o:array_of_B], (o:Object)[o:String]). Cause: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Number VM: 1.8.0_342@http://java.oracle.com/" at:
#-14 php.java.bridge.JavaBridge.offsetGet(JavaBridge.java:1878)