go280286sai/laravel_openssl

使用 OpenSSL 在 Laravel 中进行异步加密

1.2 2023-09-30 11:43 UTC

This package is auto-updated.

Last update: 2024-10-01 00:20:42 UTC


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));

执行消息解密和签名验证。如果签名有效,则返回结果。