RAD Studio 12 ではSqidsライブラリを利用できるようになりました。これによってあらゆるプラットフォームでネイティブかつ超高速な Sqids アルゴリズムを使用して、数値や数値の配列をエンコードおよびデコードできるようになりました。それだけでなく、Sqidsは標準化されているため、他のプログラミング言語とも完全に互換性があります。利用可能な言語については、SpidsのWebサイトをチェックしてください。
Table of Contents
TSqidsEncodingの使用方法
System.NetEncoding.Sqidsをコード内に定義し、新しいオブジェクトを初期化するだけです。カスタマイズしたアルファベットと長さを使用することをお勧めします。そうすることで、IDの解読がより困難になります。
それでは、簡単な例を見てみましょう。
1 2 3 4 5 6 7 8 9 10 |
procedure CreateSqids; begin var length := 10; var alphabet := 'JXx6Ue7jLqBk9cZmwA2szgdYNRP4lhOErDvQF1GTVIM3fao5t8WuSb0HyipKnC'; var sqids := TSqidsEncoding.Create(alphabet, length); var encoded := sqids.Encode(1034); // The encoded value will be '6GRy4cbTSV' var decodedSingle := sqids.DecodeSingle(encoded); // The decoded value will be an integer with the value: 1034 var decoded := sqids.Decode(encoded); // The decoded value will be and array with one value: 1034 lSqids.Free; end; |
Sqidsを使用すると、数値または数値の配列を、指定された文字と長さを使用するYouTubeのような文字列にすばやくエンコードできます。TSqidEncodingには他にも複数のメソッドがあり、より柔軟な使い方ができますが、概念的には非常に簡単でシンプルです。
RAD Serverとの統合
RAD Server には、Sqids を簡単に利用できるようにする統合機能があります。TEMSDatasetResource を使用して、属性内で ID の前に記号 # を指定するだけで、あとの作業はRAD Server が行います。
顧客向けにエンドポイントを公開しており、例えば、主キー(CUST_NO)を持つSqidsを使用したいとします。その場合、単純に以下のコードのように記述するだけです。
1 2 3 4 5 6 7 8 9 10 11 |
[ResourceName('Customers')] TCustomersResource = class(TDataModule) qryCustomers: TFDQuery; [ResourceSuffix('list', '/')] [ResourceSuffix('get', '/{#CUST_NO}')] [ResourceSuffix('put', '/{#CUST_NO}')] [ResourceSuffix('post', '/')] [ResourceSuffix('delete', '/{#CUST_NO}')] resCustomers: TEMSDataSetResource; FDConnection1: TFDConnection; end; |
RAD Server は URI レベルでしかデコードを行わないため、レスポンスの本文はエンコードされないことを理解しておくことが重要です。RAD Studio でクライアント アプリケーションを開発している場合は、EMSProvider コンポーネントでアルファベットと長さのプロパティを定義することで、リクエストも自動的にエンコードされます。(ページの最後にあるデモプロジェクトを確認してください)。
RAD Server が使用するアルファベットと長さをカスタマイズするには、EMSServer.ini に 2 つの新しいプロパティがあります。
1 2 3 4 5 6 7 |
[Server.Sqids] ;# The following options control URL parameters Sqids decoding ;# ;# Optional alphabet for Sqids decoding Alphabet= ;# Optional minimal hash length for Sqids decoding MinHashLength=0 |
Sqid はどのような状況で使用すれば良いのですか?
REST APIを開発する場合、あるいは複数のサービスが相互に通信する必要がある場合、エンドポイントのIDをあまり公開したくないかもしれません。ただほとんどの場合、エンドポイントのIDはテーブルの主キーであり、これらのエンドポイントはボットを使用してデータを収集する有力な候補となります。またセキュリティ上の潜在的な問題を最小化するためにもIDは有効です。例えば、エンドポイントの1つが不具合によって適切に保護されていないケースを考えてみましょう。インクリメンタルな数字のIDを使用することで、利用できないデータへのアクセスが容易になります。IDを難読化する理由は複数ありますが、Sqidsを使用すれば、非常に簡単かつ迅速に難読化できます。
Sqidsの利用は安全ですか?
Sqidsアルゴリズムの特徴は、非常に高速であることです。ただし、Sqidsは暗号化メカニズムではなく、クレジットカードや暗証番号などの機密データを暗号化する方法としては推奨されない点について理解しておくことが重要です。Sqidsは、難読化によるセキュリティというアプローチに従っていますが、数値IDのような単純なデータの解読をしにくくするだけで、十分な時間と忍耐力があれば、最終的にIDを解読できてしまうでしょう。
Sqidsのサンプルプログラムはありますか?
GitHubに2つのプロジェクトを用意いたしました。
Sqids Playground
サンプルプロジェクトのダウンロード: https://github.com/azapater/sqids-playground
1つ目のプロジェクトは、FireMonkeyアプリケーションで使用可能な複数のパラメータを操作して、結果をリアルタイムで確認できます。デフォルトの “Results “タブでは、MemTableに1000行が作成され、そのエンコード速度を見ることができます。さらに2つのタブがあり、選択したアルファベットと長さに基づいてエンコードとデコードをカスタマイズできます。ボタンを押して楽しんでください!
RAD Server integration
サンプルプロジェクトのダウンロード: https://github.com/azapater/sqids-radserver
2つ目のプロジェクトは、RADServerとVCLアプリケーションを含むProjectGroupです。コードを分析すると、RAD Server との通信で Sqids がどのように実装されているか、またID を自動的にエンコードおよびデコードする方法が理解できます。このプロジェクトはデータベースに接続されているため、FDConnection で InterBase で利用可能なサンプル employee.gdb データベースを定義する必要があります。
参考情報
- docwiki (System.NetEncoding.TSqidsEncoding)
- docwiki (Tutorial: Using Sqids Encoding)
- Sqidsのwebサイト(https://sqids.org)
またRAD Serverをこれから利用したいという方は、その最初のステップとして「RAD Serverテクニカルガイド」をダウンロードし、ご活用ください。
Design. Code. Compile. Deploy.
Start Free Trial Upgrade Today
Free Delphi Community Edition Free C++Builder Community Edition