如何解決URL安全的隨機(jī)令牌生成問題?使用tuupola/base62可以!

可以通過以下地址學(xué)習(xí)composer學(xué)習(xí)地址

在開發(fā)一個(gè)需要生成url安全的隨機(jī)令牌的項(xiàng)目時(shí),我遇到了一個(gè)棘手的問題:如何確保生成的令牌既安全又簡(jiǎn)潔,并且能夠在url中使用而不引起任何問題。經(jīng)過一番嘗試,我發(fā)現(xiàn)tuupola/base62庫能夠完美解決這個(gè)問題。

tuupola/base62是一個(gè)專門用于base62編碼和解碼的php庫。它不僅可以處理整數(shù),還可以對(duì)任意數(shù)據(jù)進(jìn)行編碼和解碼,這對(duì)于生成URL安全的隨機(jī)令牌非常有用。

首先,使用composer安裝這個(gè)庫非常簡(jiǎn)單:

composer require tuupola/base62

這個(gè)庫支持PHP 7.1及以上版本。如果你使用的是PHP 5.6或7.0,可以安裝舊版本:

composer require "tuupola/base62:^1.0"

在使用過程中,你可以選擇使用純PHP編碼器或基于GMP(gnu Multiple Precision Arithmetic Library)的編碼器。默認(rèn)情況下,如果系統(tǒng)安裝了GMP擴(kuò)展,庫會(huì)使用GMP函數(shù);否則會(huì)使用純PHP編碼器。

以下是一個(gè)簡(jiǎn)單的例子,展示如何使用tuupola/base62庫生成和解碼隨機(jī)令牌:

$base62 = new TuupolaBase62;  $encoded = $base62->encode(random_bytes(128)); $decoded = $base62->decode($encoded);

如果你需要處理整數(shù),可以使用encodeInteger()和decodeInteger()方法:

$integer = $base62->encodeInteger(987654321); /* 14q60P */ print $base62->decodeInteger("14q60P"); /* 987654321 */

需要注意的是,編碼字符串和整數(shù)會(huì)產(chǎn)生不同的結(jié)果:

$string = $base62->encode("987654321"); /* KHc6iHtXW3iD */ $integer = $base62->encodeInteger(987654321); /* 14q60P */

tuupola/base62庫還支持自定義字符集。默認(rèn)使用GMP風(fēng)格的字符集,但你也可以選擇反轉(zhuǎn)字符集或其他任何包含62個(gè)唯一字符的自定義字符集:

use TuupolaBase62;  print Base62::GMP; /* 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz */ print Base62::INVERTED; /* 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ */  $default = new Base62(["characters" => Base62::GMP]); $inverted = new Base62(["characters" => Base62::INVERTED]); print $default->encode("Hello world!"); /* T8dgcjRGuYUueWht */ print $inverted->encode("Hello world!"); /* t8DGCJrgUyuUEwHT */

性能方面,如果系統(tǒng)支持GMP擴(kuò)展,使用GMP編碼器會(huì)比純PHP編碼器快得多。以下是編碼128字節(jié)隨機(jī)數(shù)據(jù)的基準(zhǔn)測(cè)試結(jié)果:

$ php --version PHP 8.0.7 (cli) (built: Jun  4 2021 03:50:01) ( NTS )  $ make bench  +-----------------------+------------------+-----------+ | subject               | mean             | diff      | +-----------------------+------------------+-----------+ | benchGmpDecoder       | 140,409.997ops/s | 1.10x     | | benchGmpDecoderCustom | 154,607.297ops/s | 1.00x     | | benchPhpDecoder       | 721.147ops/s     | 214.39x   | | benchBcmathDecoder    | 72.191ops/s      | 2,141.64x | +-----------------------+------------------+-----------+  +-----------------------+------------------+-----------+ | subject               | mean             | diff      | +-----------------------+------------------+-----------+ | benchGmpEncoder       | 352,609.309ops/s | 1.00x     | | benchGmpEncoderCustom | 350,140.056ops/s | 1.01x     | | benchPhpEncoder       | 669.959ops/s     | 526.31x   | | benchBcmathEncoder    | 72.956ops/s      | 4,833.21x | +-----------------------+------------------+-----------+

如果你更喜歡使用靜態(tài)語法,可以使用提供的靜態(tài)代理:

use TuupolaBase62Proxy as Base62;  $encoded = Base62::encode(random_bytes(128)); $decoded = Base62::decode($encoded);  $encoded2 = Base62::encodeInteger(987654321); $decoded2 = Base62::decodeInteger($encoded2);

總的來說,tuupola/base62庫通過其高效的base62編碼和解碼功能,解決了我在項(xiàng)目中遇到的URL安全隨機(jī)令牌生成問題。它不僅操作簡(jiǎn)單,而且性能優(yōu)異,非常適合需要在URL中使用安全且簡(jiǎn)潔的令牌的場(chǎng)景。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊15 分享