
序文
序文
通信テクノロジーにより世界はさらにつながり、私たち一人ひとりがそのつながりから影響を受け、恩恵を受けています。同時に、この接続により、監視ニーズの利便性も向上します。多くの人のプライバシーや自由が不注意で侵害される可能性があり、プライバシー保護の必要性が生じています。通常、集中サーバーが存在するため、プライバシーを完全に保護することは困難ですが、分散ストレージなどのテクノロジーによりそれが可能になります。
Chuangyu Blockchain Security Lab がこれについて詳しく説明します。
最初のレベルのタイトル
WebインターフェースとIPFS
1. Webインターフェースとは
Web3.0では、分散パブリックチェーン技術の機能により、ユーザーが呼び出すためのさまざまなインターフェースが提供されますが、これらのインターフェースを一般のユーザーが直接使用することはできません。ユーザーにとって、Web インターフェイスはユーザーと Web サーバー上で実行されているソフトウェアの間の橋渡しとなります。ユーザーはブラウザを使用して Web インターフェイスに接続し、表示と操作を行うと同時に、ウォレットを通じて自分自身を識別します。基礎となるブロックチェーン インフラストラクチャの場合、Web インターフェイスはパブリック チェーン/スマート コントラクトのカプセル化層であり、ユーザーが直接利用できるわかりやすいページにパッケージ化されています。その構造と機能は次の図に似ています。
2.IPFSとは
Interplanetary File System (IPFS) は、分散ストレージおよび共有ファイルのためのネットワーク伝送プロトコルであり、既存の成功したシステム分散ハッシュ テーブル、バージョン管理システム Git、BitTorrent、自己認証ファイル システム、およびブロックチェーンを組み合わせています。これらのシステムの包括的な利点により、IPFS に次の注目すべき機能がもたらされます。
1. ファイルの永続的な分散ストレージと共有
2. ピアツーピア ハイパーメディア: P2P はさまざまな種類のデータを保存します
3. バージョン管理: ファイルの変更履歴を追跡可能
4. コンテンツのアドレス指定可能: ファイルの保存場所ではなく、ファイルのコンテンツから独立したハッシュ値を生成することでファイルを識別します。
ユーザーがファイルを IPFS に追加すると、ファイルは小さなチャンクに分割され、暗号的にハッシュされ、一意のフィンガープリントとしてコンテンツ識別子 (CID) が与えられます。他のノードがファイルを探すとき、ノードはピアに、参照されているコンテンツを誰が保存しているかを尋ねます。ファイルの CID によって、ファイルを表示およびダウンロードすると、キャッシュされたコピーが保持され、キャッシュがクリアされるまでそのコンテンツの別のプロバイダーになります。
IPFSの使用例https://ipfs.ioWebサイト
クライアントに UI インターフェイスを提供します。インストールと操作後、IPFS サービスが開始され、現在のノード ID、ゲートウェイ、および API アドレスが表示されます。
アップロードしたいファイルをインポートします。ファイルが正常にアップロードされると、ファイルの CID 情報が生成されます。また、QmHash (CID) を通じて指定されたファイルを見つけることもできます。
IPFS は分散ストレージおよび共有ファイル用のネットワーク伝送プロトコルであるため、正常にアップロードされたファイルが他のノードにコピーされた後は、ローカル ノードがそのファイルを積極的に削除した場合でも、そのファイルは引き続き IPFS ネットワーク上でクエリできます。
IPFS における従来のセキュリティ問題
使用例によると、IPFS ではあらゆる種類のファイルのアップロードが許可されていることがわかりますが、Web アクセスによるファイルのダウンロードを許可する機能により、攻撃者は HTML または SVG ファイルを使用して、従来のセキュリティと同様にフィッシングを実行できます。https://IPFS.ioによる
ゲートウェイを例に挙げると、メタマスク フィッシング Web サイトをアップロードします。ファイルは信頼できるドメイン名に保存されているため、被害者がファイルにアクセスすると攻撃は成功する可能性が高くなります。
ただし、IPFS は CID を介してのみファイルをクエリできるため、フィッシング攻撃の使用範囲は非常に狭く、標的型攻撃を実行する方法はありません。 CID は標的型攻撃を仕掛ける鍵となるため、CID に戻って勉強しましょう。
IPLD は、IPFS を構築するためのデータ層です。これは、Merkle-Links、Merkle-DAG、Merkle-Paths の 3 つのデータ タイプを定義します。IPLD によって IPFS に送信されたデータはチェーン上に保存され、ユーザーは、IPFS にアクセスするための CID を受け取ります。データ。
`CID::=
CID はバージョン、コーデック、マルチハッシュで構成される文字列で、現在は V0 と V1 の 2 つのバージョンに分かれています。 V0 バージョンでは、Base58 エンコーディングを使用して CID を生成し、V1 バージョンには、コンテンツを示す数値タイプの Codec、ハッシュ アルゴリズム MhType、およびハッシュ長 MhLength が含まれています。
package main
import (
"fmt"
mc "github.com/multiformats/go-multicodec"
mh "github.com/multiformats/go-multihash"
cid "github.com/ipfs/go-cid"
)
const (
File = "./go.sum"
)
func main() {
pref := cid.Prefix{
Version: 0,
Codec: mc.Raw,
MhType: mh.Base58,
MhLength: -1,
}
c, err := pref.Sum([]byte("CIDTest"))
if err != nil {...}
fmt.Println("CID: ", c)
}
go-cid を使用して一連の CID テストを生成します。
type AddEvent struct {
Name string
Hash string `json:",omitempty"`
Bytes int64 `json:",omitempty"`
Size string `json:",omitempty"`
}
const (
quietOptionName = "quiet"
quieterOptionName = "quieter"
silentOptionName = "silent"
progressOptionName = "progress"
trickleOptionName = "trickle"
wrapOptionName = "wrap-with-directory"
onlyHashOptionName = "only-hash"
chunkerOptionName = "chunker"
pinOptionName = "pin"
rawLeavesOptionName = "raw-leaves"
noCopyOptionName = "nocopy"
fstoreCacheOptionName = "fscache"
cidVersionOptionName = "cid-version"
hashOptionName = "hash"
inlineOptionName = "inline"
inlineLimitOptionName = "inline-limit"
)
CID を生成する過程では、結果の予測と置き換えが実現できないことがわかりますので、ファイルをアップロードする部分を分析してみましょう。ファイルを IPFS にアップロードし、ブロックを使用してローカル ブロックストアに保存するプロセスは、/go-ipfs-master/core/commands/add.go にあります。
func (adder *Adder) AddAllAndPin(ctx context.Context, file files.Node) (ipld.Node, error) {
ctx, span := tracing.Span(ctx, "CoreUnix.Adder", "AddAllAndPin")
defer span.End()
アップロードされたファイル情報を AddEvent オブジェクトに保存し、/go-ipfs-master/core/coreunix/add.go の addALLAndPin メソッドと fileAdder.AddFile メソッドを介してファイル パスをトラバースし、ファイルの内容を読み取り、データを送信します。ブロック:
adder.unlocker = adder.gcLocker.PinLock(ctx)
}
defer func() {
if adder.unlocker != nil {
adder.unlocker.Unlock(ctx)
}
}()
if err := adder.addFileNode(ctx, "", file, true); err != nil {
return nil, err
}
mr, err := adder.mfsRoot()
if err != nil {
return nil, err
}
var root mfs.FSNode
if adder.Pin {//knownsec ロックされている場合
root = rootdir
err = root.Flush()
if err != nil {
return nil, err
}
_, dir := file.(files.Directory)
var name string
if !dir {
children,rootdir := mr.GetDirectory()//knownsec パスを取得
if err != nil {
return nil, err
}
if len(children) == 0 {
return nil, fmt.Errorf("expected at least one child dir, got none")
}
name = children[0]
root, err = rootdir.Child(name)
if err != nil {
return nil, err
}
}
err = mr.Close()
if err != nil {
return nil, err
}
nd, err := root.GetNode()
if err != nil {
return nil, err
}
err = adder.outputDirs(name, root)
if err != nil {
return nil, err
}
if asyncDagService, ok := adder.dagService.(syncer); ok {
err = asyncDagService.Sync()
if err != nil {
return nil, err
}
}
if !adder.Pin {
return nd, nil
}
return nd, adder.PinRoot(ctx, nd)
}
err := rootdir.ListNames(adder.ctx)//knownsec 現在のパス ファイル名を表示します
func (adder *Adder) addFile(path string, file files.File) error {
var reader io.Reader = file
if adder.Progress {
rdr := &progressReader{file: reader, path: path,最後に、addFile 関数を使用してファイルをアップロードします。
if fi, ok := file.(files.FileInfo); ok {
reader = &progressReader2{rdr, fi}
} else {
reader = rdr
}
}
dagnode,out: adder.Out}//knonwsec ファイルをバイト単位で読み取ります
if err != nil {
return err
}
return adder.addNode(dagnode, path)
}
コードを分析すると、パッケージ化されたファイルをアップロードして CID を返すプロセス全体で IPFS がハイジャックされる可能性はなく、正常にアップロードされたファイルは変更または改ざんできないことがわかります。
追記
追記