El algoritmo de firma V4 protege su par de AccessKey mediante una clave derivada de corta duración para la autenticación, en lugar de usar directamente el AccessKey secret. Si la clave derivada se ve comprometida, solo se afectan los recursos de una región y un servicio específicos; además, esta clave tiene una vigencia máxima de un día y caduca automáticamente al día siguiente.
Funcionamiento de la firma V4
El algoritmo de firma V4 sustituye el uso directo del AccessKey secret por una clave derivada, valor calculado a partir de su AccessKey secret, la fecha actual, la región y el código del producto.
Si usa firmas V4 y alguna se ve comprometida, otras regiones y servicios pertenecientes a la cuenta de Alibaba Cloud o al usuario de RAM no se ven afectados. La firma V4 comprometida tiene una vigencia máxima de un día. El uso de firmas V4 le permite garantizar la seguridad de su par de AccessKey.
Alcance: Solo se afectan la región y el servicio específicos, no toda su cuenta.
-
Tiempo: La clave derivada tiene una vigencia máxima de un día y caduca automáticamente al día siguiente.
NotaPara garantizar la seguridad de sus pares de AccessKey, use firmas V4 y mantenga la confidencialidad de dichos pares. Por ejemplo, almacene los pares de AccessKey en variables de entorno dentro de su código.
Flujo de solicitud
El cliente calcula una clave derivada a partir del par de AccessKey mediante el algoritmo de firma V4 y envía la solicitud con dicha clave.
El servidor recibe la solicitud y verifica la clave derivada para autenticar al solicitante.
-
Si la autenticación es exitosa, el servidor procesa la solicitud y devuelve el resultado.
NotaSi la autenticación falla, el servidor deniega el acceso al cliente.
El cliente recibe la respuesta.
Código de ejemplo
Tablestore SDK for Java V5.16.1 y versiones posteriores admiten el algoritmo de firma V4. Antes de usar este algoritmo, asegúrese de que la versión del SDK sea compatible.
Uso de un par de AccessKey para la inicialización
En este ejemplo se usa el par de AccessKey de una cuenta de Alibaba Cloud o de un usuario de RAM para describir cómo configurar las credenciales de acceso. Para obtener más información, consulte How do I obtain an AccessKey pair?
El siguiente código de ejemplo inicializa un cliente de Tablestore con una firma V4, enumera las tablas de datos de una instancia e imprime los nombres de las tablas.
Ejemplo 1 (recomendado): Proporcione su par de AccessKey. El SDK calcula y actualiza la clave derivada automáticamente.
Ejemplo 2: Proporcione tanto el par de AccessKey como una clave derivada precalculada (
v4 SigningAccessKey). La clave derivada caduca al día siguiente. Implemente un mecanismo para actualizarla antes de su caducidad; de lo contrario, las solicitudes a Tablestore fallarán.
import com.alicloud.openservices.tablestore.SyncClient;
import com.alicloud.openservices.tablestore.core.ResourceManager;
import com.alicloud.openservices.tablestore.core.auth.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import static com.alicloud.openservices.tablestore.core.Constants.PRODUCT;
import static com.alicloud.openservices.tablestore.core.Constants.SIGNING_KEY_SIGN_METHOD;
public class InitClientV4 {
public static void main(String[] args) {
// Specify the region where the instance resides. Example: cn-hangzhou.
final String region = "yourRegion";
// Specify the instance name.
final String instanceName = "yourInstanceName";
// Specify the instance endpoint.
final String endpoint = "yourEndpoint";
// Obtain the AccessKey ID and AccessKey secret from environment variables.
final String accessKeyId = System.getenv("TABLESTORE_ACCESS_KEY_ID");
final String accessKeySecret = System.getenv("TABLESTORE_ACCESS_KEY_SECRET");
{
/**
* Example 1: Construct {@link DefaultCredentials} from the AccessKey ID and
* AccessKey secret, then generate {@link V4Credentials}.
*/
DefaultCredentials credentials = new DefaultCredentials(accessKeyId, accessKeySecret);
V4Credentials credentialsV4 = V4Credentials.createByServiceCredentials(credentials, region);
CredentialsProvider provider = new DefaultCredentialProvider(credentialsV4);
// Initialize the Tablestore client with V4Credentials.
SyncClient client = new SyncClient(endpoint, provider, instanceName, null, new ResourceManager(null, null));
// do something
client.listTable().getTableNames().forEach(System.out::println);
// Shut down the Tablestore client.
client.shutdown();
}
{
/**
* Example 2: Construct {@link V4Credentials} directly from the AccessKey pair
* and a pre-computed derived key.
*/
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
String signDate = dateFormat.format(new Date()); // Example: 20230527
String v4SigningAccessKey = CalculateV4SigningKeyUtil.finalSigningKeyString(accessKeySecret, signDate, region, PRODUCT, SIGNING_KEY_SIGN_METHOD); // Derived key
V4Credentials credentialsV4 = new V4Credentials(accessKeyId, v4SigningAccessKey, region, signDate);
CredentialsProvider provider = new DefaultCredentialProvider(credentialsV4);
// Initialize the Tablestore client with V4Credentials.
SyncClient client = new SyncClient(endpoint, provider, instanceName, null, new ResourceManager(null, null));
// do something
client.listTable().getTableNames().forEach(System.out::println);
// Shut down the Tablestore client.
client.shutdown();
}
}
}
Uso de STS para la inicialización
Para obtener información sobre cómo conseguir credenciales de acceso temporales de Security Token Service (STS), consulte Use temporary access credentials obtained from STS to access Tablestore .
El siguiente código de ejemplo inicializa un cliente de Tablestore con una firma V4 mediante credenciales de acceso temporales de STS, enumera las tablas de datos de una instancia e imprime los nombres de las tablas.
Ejemplo 1 (recomendado): Proporcione las credenciales de acceso temporales de STS. El SDK calcula y actualiza la clave derivada automáticamente.
Ejemplo 2: Proporcione tanto las credenciales de acceso temporales de STS como una clave derivada precalculada (
v4 SigningAccessKey). La clave derivada caduca al día siguiente. Implemente un mecanismo para actualizarla antes de su caducidad; de lo contrario, las solicitudes a Tablestore fallarán.
import com.alicloud.openservices.tablestore.SyncClient;
import com.alicloud.openservices.tablestore.core.ResourceManager;
import com.alicloud.openservices.tablestore.core.auth.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import static com.alicloud.openservices.tablestore.core.Constants.PRODUCT;
import static com.alicloud.openservices.tablestore.core.Constants.SIGNING_KEY_SIGN_METHOD;
public class InitClientV4 {
public static void main(String[] args) {
// Specify the region where the instance resides. Example: cn-hangzhou.
final String region = "yourRegion";
// Specify the instance name.
final String instanceName = "yourInstanceName";
// Specify the instance endpoint.
final String endpoint = "yourEndpoint";
// Obtain the temporary AccessKey ID, temporary AccessKey secret, and security token from environment variables.
final String accessKeyId = System.getenv("TABLESTORE_ACCESS_KEY_ID");
final String accessKeySecret = System.getenv("TABLESTORE_ACCESS_KEY_SECRET");
final String securityToken = System.getenv("TABLESTORE_SESSION_TOKEN");
{
/**
* Example 1: Construct {@link DefaultCredentials} from the temporary AccessKey ID,
* AccessKey secret, and security token, then generate {@link V4Credentials}.
*/
DefaultCredentials credentials = new DefaultCredentials(accessKeyId, accessKeySecret, securityToken);
V4Credentials credentialsV4 = V4Credentials.createByServiceCredentials(credentials, region);
CredentialsProvider provider = new DefaultCredentialProvider(credentialsV4);
// Initialize the Tablestore client with V4Credentials.
SyncClient client = new SyncClient(endpoint, provider, instanceName, null, new ResourceManager(null, null));
// do something
client.listTable().getTableNames().forEach(System.out::println);
// Shut down the Tablestore client.
client.shutdown();
}
{
/**
* Example 2: Construct {@link V4Credentials} directly from the STS temporary
* access credentials and a pre-computed derived key.
*/
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
String signDate = dateFormat.format(new Date()); // Example: 20230527
String v4SigningAccessKey = CalculateV4SigningKeyUtil.finalSigningKeyString(accessKeySecret, signDate, region, PRODUCT, SIGNING_KEY_SIGN_METHOD);
V4Credentials credentialsV4 = new V4Credentials(accessKeyId, v4SigningAccessKey, securityToken, region, signDate);
CredentialsProvider provider = new DefaultCredentialProvider(credentialsV4);
// Initialize the Tablestore client with V4Credentials.
SyncClient client = new SyncClient(endpoint, provider, instanceName, null, new ResourceManager(null, null));
// do something
client.listTable().getTableNames().forEach(System.out::println);
// Shut down the Tablestore client.
client.shutdown();
}
}
}