O algoritmo de assinatura V4 protege seu par de AccessKey ao usar uma chave derivada de curta duração para autenticação, em vez do AccessKey secret diretamente. Se a chave derivada for comprometida, apenas os recursos de uma região e serviço específicos serão afetados. Além disso, essa chave tem validade máxima de um dia e expira automaticamente no dia seguinte.
Funcionamento da assinatura V4
O algoritmo de assinatura V4 substitui o uso direto do AccessKey secret por uma chave derivada. Esse valor é calculado com base no seu AccessKey secret, na data atual, na região e no código do produto.
Se você usar assinaturas V4 e uma delas for roubada, outras regiões e serviços vinculados à conta Alibaba Cloud ou ao usuário RAM não serão afetados. A assinatura V4 roubada permanece válida por, no máximo, um dia. Use assinaturas V4 para garantir a segurança do seu par de AccessKey.
Escopo: Apenas a região e o serviço específicos são afetados, e não toda a sua conta.
-
Tempo: A chave derivada é válida por, no máximo, um dia e expira automaticamente no dia seguinte.
NotaUse assinaturas V4 e mantenha os pares de AccessKey em sigilo para garantir a segurança dessas credenciais. Por exemplo, armazene os pares de AccessKey em variáveis de ambiente no código.
Fluxo da solicitação
O cliente calcula uma chave derivada a partir do par de AccessKey usando o algoritmo de assinatura V4 e envia a solicitação com essa chave.
O servidor recebe a solicitação e verifica a chave derivada para autenticar o chamador.
-
Se a autenticação for bem-sucedida, o servidor processará a solicitação e retornará o resultado.
NotaSe a autenticação falhar, o servidor negará o acesso ao cliente.
O cliente recebe a resposta.
Código de exemplo
O Tablestore SDK for Java V5.16.1 e versões posteriores suportam o algoritmo de assinatura V4. Antes de usar esse algoritmo, verifique se a versão do SDK em uso oferece suporte a ele.
Usar um par de AccessKey para inicialização
Neste exemplo, usa-se o par de AccessKey de uma conta Alibaba Cloud ou de um usuário RAM para descrever como configurar as credenciais de acesso. Para mais informações, consulte Como obtenho um par de AccessKey?
O código de exemplo a seguir inicializa um cliente Tablestore usando uma assinatura V4, lista as tabelas de dados de uma instância e imprime os nomes das tabelas.
Exemplo 1 (recomendado): Forneça seu par de AccessKey. O SDK calcula e renova a chave derivada automaticamente.
Exemplo 2: Forneça o par de AccessKey e uma chave derivada pré-calculada (
v4 SigningAccessKey). A chave derivada expira no dia seguinte. Implemente um mecanismo para renová-la antes da expiração; caso contrário, as solicitações ao Tablestore falharão.
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();
}
}
}
Usar STS para inicialização
Para obter informações sobre como adquirir credenciais de acesso temporárias do Security Token Service (STS), consulte Usar credenciais de acesso temporárias obtidas do STS para acessar o Tablestore .
O código de exemplo a seguir inicializa um cliente Tablestore usando uma assinatura V4 com credenciais de acesso temporárias do STS, lista as tabelas de dados de uma instância e imprime os nomes das tabelas.
Exemplo 1 (recomendado): Forneça as credenciais de acesso temporárias do STS. O SDK calcula e renova a chave derivada automaticamente.
Exemplo 2: Forneça as credenciais de acesso temporárias do STS e uma chave derivada pré-calculada (
v4 SigningAccessKey). A chave derivada expira no dia seguinte. Implemente um mecanismo para renová-la antes da expiração; caso contrário, as solicitações ao Tablestore falharão.
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();
}
}
}