使用 .NET 创建内容密钥

媒体服务允许创建资产和传送加密的资产。ContentKey 提供对资产的安全访问。

创建新资产时(例如,上传文件之前),可以指定以下加密选项:StorageEncryptedCommonEncryptionProtectedEnvelopeEncryptionProtected

向客户端传送资产时,可以使用以下两个加密选项之一将资产配置为动态加密DynamicEnvelopeEncryptionDynamicCommonEncryption

加密的资产必须与 ContentKey 关联。本文介绍如何创建内容密钥。

Note

使用媒体服务 .NET SDK 创建新的 StorageEncrypted 资产时,会自动创建 ContentKey 并将其链接到资产。

ContentKeyType

创建内容密钥时必须设置的值之一是内容密钥类型。选择以下值之一。

public enum ContentKeyType
{
    /// <summary>
    /// Specifies a content key for common encryption.
    /// </summary>
    /// <remarks>This is the default value.</remarks>
    CommonEncryption = 0,

    /// <summary>
    /// Specifies a content key for storage encryption.
    /// </summary>
    StorageEncryption = 1,

    /// <summary>
    /// Specifies a content key for configuration encryption.
    /// </summary>
    ConfigurationEncryption = 2,

    /// <summary>
    /// Specifies a content key for Envelope encryption.  Only used internally.
    /// </summary>
    EnvelopeEncryption = 4
}

创建信封类型 ContentKey

以下代码段创建信封加密类型的内容密钥。然后,它会将密钥与指定的资产关联。

static public IContentKey CreateEnvelopeTypeContentKey(IAsset asset)
{
    // Create envelope encryption content key
    Guid keyId = Guid.NewGuid();
    byte[] contentKey = GetRandomBuffer(16);

    IContentKey key = _context.ContentKeys.Create(
                            keyId,
                            contentKey,
                            "ContentKey",
                            ContentKeyType.EnvelopeEncryption);

    asset.ContentKeys.Add(key);

    return key;
}

static private byte[] GetRandomBuffer(int size)
{
    byte[] randomBytes = new byte[size];
    using (RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider())
    {
        rng.GetBytes(randomBytes);
    }

    return randomBytes;
}

call

IContentKey key = CreateEnvelopeTypeContentKey(encryptedsset);

创建公共类型 ContentKey

以下代码段创建公共加密类型的内容密钥。然后,它会将密钥与指定的资产关联。

static public IContentKey CreateCommonTypeContentKey(IAsset asset)
{
    // Create common encryption content key
    Guid keyId = Guid.NewGuid();
    byte[] contentKey = GetRandomBuffer(16);

    IContentKey key = _context.ContentKeys.Create(
                            keyId,
                            contentKey,
                            "ContentKey",
                            ContentKeyType.CommonEncryption);

    // Associate the key with the asset.
    asset.ContentKeys.Add(key);

    return key;
}

static private byte[] GetRandomBuffer(int length)
{
    var returnValue = new byte[length];

    using (var rng =
        new System.Security.Cryptography.RNGCryptoServiceProvider())
    {
        rng.GetBytes(returnValue);
    }

    return returnValue;
}

call

IContentKey key = CreateCommonTypeContentKey(encryptedsset);