> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Services de chiffrement des joueurs

> Découvrez les secrets partagés par les joueurs PlayFab, les clés publiques de titre et les charges utiles d'inscription chiffrées par RSA utilisées pour sécuriser la création de comptes et les demandes de connexion client.

## Secrets partagés par les joueurs

Les secrets partagés par les joueurs constituent un nouveau type de pseudo-clé secrète, partagée entre les clients de jeu. À l'aide d'une API, ils peuvent être échangés contre la clé RSA publique du titre, puis utilisés pour effectuer l'inscription de comptes.

Les titres peuvent avoir plusieurs clés partagées par les joueurs, et peuvent les configurer et les révoquer à volonté au moyen des appels de l'API Admin [Create](xref:titleid.playfabapi.com.admin.authentication.createplayersharedsecret), [Update](xref:titleid.playfabapi.com.admin.authentication.updateplayersharedsecret), [Delete](xref:titleid.playfabapi.com.admin.authentication.deleteplayersharedsecret), [List](xref:titleid.playfabapi.com.admin.authentication.getplayersharedsecrets).

Les secrets partagés par les joueurs doivent être intégrés dans les clients respectifs, car il n'existe aucune API client pour les récupérer, avec ou sans authentification.

## Clé publique du titre

Le secret partagé par les joueurs est ensuite envoyé à [GetTitlePublicKey](xref:titleid.playfabapi.com.client.authentication.gettitlepublickey). Si la clé est valide, l'API renvoie un tableau d'octets de blob CSP RSA encodé en Base 64 qui peut chiffrer 237 octets de données.

Toutes les API qui permettent de créer des comptes acceptent maintenant la publication d'une demande d'inscription sous forme de charge utile chiffrée dans le champ `EncryptedRequest`.

<Note>
  Les champs standard **`TitleId`**, **`InfoRequestParameters`** et **`CreateAccount`** ne doivent *pas* être inclus dans la charge utile chiffrée.
</Note>

## Utilisation de la clé publique du titre pour l'inscription

Voici un exemple de code permettant d'inscrire un joueur à l'aide de `LoginWithCustomID` et de la clé publique du titre.

```csharp theme={null}
var titleKeyResult = PlayFabClientAPI.GetTitlePublicKey(new GetTitlePublicKeyRequest{ TitleId = "TITLE", TitleSharedSecret = "player shared secret" });

var cspBlob = Convert.FromBase64String(titleKeyResult.RSAPublicKey);

var encryptionModel = JsonConvert.SearializeObject(new LoginWithCustomIDRequest

{
    CustomID = "my player's custom id",
    PlayerSecret = "my player's individual secret"
});

string encryptedPayload;

using (var rsa = new RSACryptoServiceProvider())
{
    rsa.ImportCspBlob(cspBlob);
    var bytesToEncrypt = Encoding.UTF8.GetBytes(encryptionModel);
    var encryptedBytes = rsa.Encrypt(bytesToEncrypt, false);
    encryptedPayload = Convert.ToBase64String(encryptedBytes);
}

var postModel = new LoginWithCustomIDRequest
{
    TitleId = "TITLEID",
    EncryptedRequest = encryptedPayload,
    CreateAccount = True
};

var createAccountResult = PlayFabClientAPI.LoginWithCustomID(postModel);
```

## Secret du joueur

Le nouveau système d'inscription comprend un nouveau champ appelé `PlayerSecret`. S'il est défini, il vous permet de signer les en-têtes de demande, qui sont validés par le serveur lors des appels d'API à tous les services, y compris les demandes de connexion.

Le secret du joueur ne peut être défini qu'*une seule fois* par utilisateur et par titre. Un utilisateur ayant plusieurs titres dans le même studio doit définir le secret du joueur pour chacun d'eux.

Si le secret du joueur n'a pas déjà été défini lors de l'inscription, il est possible de le définir en appelant [SetPlayerSecret](xref:titleid.playfabapi.com.client.authentication.setplayersecret). Des API d'administration et de serveur permettent de définir le secret du joueur à une *nouvelle* valeur même s'il a déjà été défini.

<Note>
  Une fois défini, le secret du joueur doit être stocké de façon sécuritaire sur l'appareil, car il n'est *pas* récupérable en cas de perte, et il n'existe *aucune* API pour le récupérer.
</Note>

## Utilisation du secret du joueur pour signer les demandes d'API

L'exemple de code suivant construit un en-tête de signature qui peut être utilisé pour signer les demandes d'API. Le format de l'en-tête de signature est présenté ci-dessous.

`jsonRequestModel.utcTimeStampInISO.playerSecret`

```csharp theme={null}
var postModel = new LoginWithCustomIDRequest

{
    TitleId = "TITLEID",
    CustomID =  "my player's custom id",
    CreateAccount = False
};

string signatureHeader;
string timestampHeader = DateTime.UtcNow.ToString("O");

string playerSecret; // the player secret that was sent during registration.

 using (var hash = new SHA256Managed())
{
    var bytesToHash = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(postModel)+"." + timestampHeader + "." + playerSecret);
    signatureHeader = hash.ComputeHash(bytesToHash);
}

var customHeaders = new Dictionary<string, string>
{
    { "X-PlayFab-Signature", signatureHeader },
    { "X-PlayFab-Timestamp", timestampHeader }
}

var loginResult = PLayFabClientAPI.LoginWithCustomID(postModel, customHeaders);
```

## Utilisation de l'application d'une stratégie

Les [stratégies d'API](https://playfab.com/blog/permission-policies/) peuvent maintenant être utilisées pour imposer ces scénarios.

* Une demande client est une charge utile chiffrée.
* Une demande client contient des en-têtes signés.

Même *sans* l'application d'une stratégie, si une charge utile chiffrée est envoyée (ou si les en-têtes sont envoyés), ils seront validés. S'ils ne sont pas correctement formés, une erreur se produit.

Pour créer une stratégie exigeant des en-têtes sur une API précise, utilisez une instruction `Deny`. Cela crée une stratégie exigeant des en-têtes sur *tous* les appels que vous pouvez effectuer et qui ne sont pas permis par l'instruction `Allow`.

Les instructions de stratégie ont une propriété appelée `ApiConditions`. `ApiConditions` contient une propriété appelée `HasSignatureOrEncryption`, qui est une énumération comportant trois valeurs possibles :

* `Any`
* `True`
* `False`

<Note>
  La valeur par défaut (si elle n'est *pas* définie par la stratégie) est **`Any`**.
</Note>

L'exemple de stratégie suivant autorise *tous* les appels d'API (sauf les appels non chiffrés ou sans en-têtes) à `LoginWithCustomID`.

```json theme={null}
{
    "PolicyName": "ApiPolicy",
    "OverwritePolicy": true,
    "Statements":
    [
        {
            "Comment": "Require Headers on LoginWithCustomID",
            "Action": "*",
            "Principal": "*",
            "Effect": "Deny",
            "Resource": "pfrn:api--/Client/LoginWithCustomID",
            "ApiConditions": { "HasSignatureOrEncryption": "False" }
        },
        {
            "Comment": "Allow the rest policy",
            "Action": "*",
            "Principal": "*",
            "Effect": "Allow",
            "Resource": "pfrn:api--*"
        }
    ]
}
```

L'instruction `Deny` ci-dessus contient `HasSignatureOrEncryption: False`. Cela signifie que toutes les demandes qui n'ont pas de signature ni de chiffrement sont rejetées. Autrement dit, toutes les demandes qui *ont* des en-têtes de signature ou un chiffrement sont autorisées en fonction de `Allow the rest policy`.


## Related topics

- [Authentification des services XBOX pour les services de titre](/fr-CA/services/xbox-services/fundamentals/s2s-auth-calls/service-authentication/live-title-service-authentication.md)
- [Jetons de sécurité des services XBOX (jetons XSTS)](/fr-CA/services/xbox-services/fundamentals/s2s-auth-calls/service-authentication/security-tokens/live-security-tokens.md)
- [Configuration des services web dans Partner Center](/fr-CA/services/xbox-services/fundamentals/s2s-auth-calls/custom-service-config/web-services/live-web-services.md)
- [Configuration des segments de joueurs](/fr-CA/services/playfab/player-progression/player-data/player-segment-configuration.md)
- [Système de bannissement des joueurs](/fr-CA/services/playfab/player-progression/player-data/player-bans.md)
