Signing and Verifying Arbitrary Data

[Previous << Transactions](https://qiita.com/flowcadence/items/318a428e8c006dc2497f)
[Next >> WalletConnect 2.0 Manual Configuration](https://qiita.com/flowcadence/items/da6327777ef6c7e811cb)

https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a#reference-2020832ebee1810a325a

<h1>Signing Arbitrary Data</h1>

暗号署名はブロックチェーンの重要な要素です。秘密鍵を公開することなくアドレスの所有を証明するために使用されます。主にトランザクションの署名に使用されますが、暗号署名は任意のメッセージの署名にも使用できます。

FCLには、設定されたウォレットorサービスに対して任意のデータを送信し、ユーザーが秘密鍵を使って署名することを承認できる機能があります。
<h1>Verifying User Signatures</h1>

メッセージの署名をより面白いものにしているのは、私たちはFlowブロックチェーンを使って、署名を検証することができることです。Cadenceには、`publicKey.verify`という組み込み関数が用意されており、引数として渡したアカウントのアドレスのFlowアカウントに対して署名を検証することができます。

FCLには、Flowブロックチェーン上のアカウントの公開鍵に対して1つまたは複数の署名を検証するための、`AppUtils.verifyUserSignatures`というユーティリティ関数が含まれています。

両者を併用することで、ユーザーが秘密鍵を管理していることを証明することができます。

これにより、ユーザーの公開アドレスをIDとするメッセージ署名ベースの認証メカニズムを使用した暗号学的に安全なログイン・フローが可能となります。


<h1>currentUser.signUserMessage()</h1>

FCL対応ウォレット/サービス経由でユーザーが直接署名することができるメソッド。
> Note：**認証済みの署名サービスでの認証/設定が必要です。（Requires authentication/configuration with an authorized signing service.）**

<h3>Arguments</h3>

| Name | Type | Description |
|:-:|:-:|:-:|
| `message` | string | A hexadecimal string to be signed |

**Returns**
| Type | Description |
|:-:|:-:|
| `Array` | An Array of [CompositeSignatures](https://github.com/onflow/fcl-js/blob/master/packages/fcl-core/src/wallet-provider-spec/draft-v2.md#compositesignature) (signature) |

**Usage**
```ruby
import * as fcl from "@onflow/fcl"

const signMessage = async () => {
  const MSG = Buffer.from("FOO").toString("hex")
  try {
    return await fcl.currentUser.signUserMessage(MSG)
  } catch (error) {
    console.log(error)
  }
}
```

<h1>AppUtils.verifyUserSignatures</h1>

**Note**
⚠️ この API を使用するには、`fcl.config.flow.network` または options override が必要です。 [FCL Configuration](https://qiita.com/flowcadence/items/b85a6df60a980c8e1dc1)を参照してください。

メッセージがユーザーの秘密鍵によって署名されていることを検証することで、 Flow アカウントの所有を暗号学的にアプリケーションが検証できるようにしたメソッド。これは通常、`currentUser.signUserMessage` のレスポンスと一緒に使用されます。

<h3>Arguments</h3>

| Name | Type | Description |
|:-:|:-:|:-:|
| `message` | string **(required)** | A hexadecimal string |
| `compositeSignatures` | Array **(required)** | An Array of `CompositeSignatures` |
| `opts` | Object **(optional)** | `opts.fclCryptoContract`を指定することで、ローカル開発用のFCLCryptoContractアドレスを上書きすることができます。 |

**Returns**
| Type | Description |
|:-:|:-:|
| Boolean | `true` if verified or `false` |

**Usage**
```ruby
/**
 * Verify a valid signatures for an account on Flow.
 *
 * @param {string} msg - A message string in hexadecimal format
 * @param {Array} compSigs - An array of Composite Signatures
 * @param {string} compSigs[].addr - The account address
 * @param {number} compSigs[].keyId - The account keyId
 * @param {string} compSigs[].signature - The signature to verify
 * @param {Object} [opts={}] - Options object
 * @param {string} opts.fclCryptoContract - An optional override of Flow account address where the FCLCrypto contract is deployed
 * @return {bool}
 *
 * @example
 *
 *  const isValid = await fcl.AppUtils.verifyUserSignatures(
 *    Buffer.from('FOO').toString("hex"),
 *    [{f_type: "CompositeSignature", f_vsn: "1.0.0", addr: "0x123", keyId: 0, signature: "abc123"}],
 *    {fclCryptoContract}
 *  )
 */
```
**Examples**
使用例としては、暗号ログイン(cryptographic login)、メッセージの検証、検証可能なクレデンシャルなどがあります。



*Last updated on **Nov 26, 2024** by **Giovanni Sanchez***

翻訳元

https://developers.flow.com/tools/clients/fcl-js/user-signatures

***
<b>[Previous << Transactions](https://qiita.com/flowcadence/items/318a428e8c006dc2497f)
</b>

[Flow blockchain / Cadence version1.0ドキュメント](https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a) (Signing and Verifying Arbitrary Data)

<b>[Next >> WalletConnect 2.0 Manual Configuration](https://qiita.com/flowcadence/items/da6327777ef6c7e811cb)</b>