go280286sai / laravel_openssl
使用 OpenSSL 在 Laravel 中进行异步加密
Requires
- ext-openssl: *
README
发布 "config/openssl.php","resources/views/vendor/openssl"
php artisan vendor:publish --provider="go280286sai\laravel_openssl\Providers\OpensslProvider"
安装包后,必须执行迁移
php artisan migrate
更改文件夹权限
转到 "/vendor/go280286sai/laravel_openssl/src/OpenSSL/files/"
chmod a+w -R ssl
生成公钥和获取数据
要手动生成新密钥,请执行以下操作
php artisan openssl:new
为了获取个人信息
php artisan:show
-----BEGIN PUBLIC KEY-----
"----------------------------------"
-----END PUBLIC KEY-----
个人密钥:*************
获取到的数据需要用于向我们提供信息!
可以在 /vendor/go280286sai/laravel_openssl/src/Models/Ssl_search 中更改密钥
public static string $ssl_public_key = '*************';
创建一个控制器来处理资源
php artisan make:controller OpensslController -r
为了显示所有可用的资源,添加一个方法
public function index(): View
{
$resource = Ssl_search::all();
return view('vendor.openssl.index', ['resource' => $resource]);
}
为了添加资源,创建控制器并添加方法
public function create(): View
{
return view('vendor.openssl.add_resource');
}
public function store(Request $request): RedirectResponse
{
$request->validate([
'name' => 'required|string',
'key' => 'required|string',
'url' => 'required|string',
]);
Ssl_search::add_resource(['name' => $request->name, 'key' => $request->key, 'url' => $request->url]);
return redirect()->back();
}
资源名称和地址将添加到数据库 'ssl_searches' 中,而公钥将以获取到的 id 命名并保存为 1_id_public.pem 格式,存储在 "/vendor/go280286sai/laravel_openssl/src/OpenSSL/files/ssl" 地址下
为了更新资源
public function edit(int $id): View
{
$resource = Ssl_search::find($id);
$publicKey = Ssl_search::get_public_key($id . Ssl_search::$toSave);
return view('vendor.openssl.update_resource', ['resource' => $resource, 'publicKey' => $publicKey]);
}
public function update(Request $request, string $id): RedirectResponse
{
$request->validate([
'name' => 'required|string',
'key' => 'required|string',
'url' => 'required|string',
]);
Ssl_search::update_resource(['name' => $request->name, 'key' => $request->key, 'url' => $request->url], $id);
return redirect()->back();
}
为了删除
public function destroy(int $id): RedirectResponse
{
Ssl_search::remove($id);
return redirect()->back();
}
传输加密信息
public function message(): View
{
$resource = Ssl_search::all();
return view('vendor.openssl.send_message', ['resource' => $resource]);
}
public function send_message(Request $request): RedirectResponse
{
$id = $request->get('id');
$text = $request->get('text');
$url = Ssl_search::find($id)->url;
$key = Ssl_search::get_public_key($id . Ssl_search::$toSave);
$send = Ssl_search::encrypt($text, $key);
$name = Ssl_search::$ssl_public_key;
try {
$result = Http::post($url, ['name'=>$name, 'text'=>$send]);
if ($result->status() != 200) {
throw new \Exception('Not connection');
}
}
catch (\Throwable $th) {
LogMessage::send('error: '. $th->getMessage());
}
return redirect()->back();
}
从表单中传递 id 和消息文本。根据 id 获取发送 URL。
$name = Ssl_search::$ssl_public_key - 系统密钥名称,将用它发送消息。
$key = Ssl_search::get_public_key($id . Ssl_search::$toSave) - 加载该资源的公钥。
Ssl_search::$toSave - 保存名称。
$send = Ssl_search::encrypt($text, $key) - 执行消息编码并添加签名。
$result = Http::post($url, ['name'=>$name, 'text'=>$send]) - 传输数据。
添加的路由
Route::resource('/resource', OpensslController::class);
Route::get('/ssl/message', [OpensslController::class, 'message']);
Route::post('/ssl/send_message', [OpensslController::class, 'send_message']);
获取消息
在 /vendor/go280286sai/laravel_openssl/src/Http/Controllers/OpenSslController
public function index(Request $request): string
{
$id = Ssl_search::where('name', $request->get('name'))->first('id');
try {
$result = Ssl_search::decrypt($request->get('text'), Ssl_search::get_public_key($id->id . '_id_public'));
LogMessage::send($result);
return 'ok';
}
catch (\Throwable $th) {
LogMessage::send('error: '. $th->getMessage());
return $th->getMessage();
}
}
根据数据库中提供的资源名称找到其 id,并将其以及 $data 数组传递给函数
Ssl_search::decrypt($data, Ssl_search::get_public_key($id['id']. Ssl_search::$toSave));
执行消息解密和签名验证。如果签名有效,则返回结果。