Adição de um sal no campo de senha ao criar um nó
Quando um nó é criado por meio da API, você precisa adicionar um sal ao campo password para proteger a senha. O procedimento é o seguinte:
O sal deve ser definido com base nos requisitos de complexidade de senha:
- Uma cadeia de 8 a 26 caracteres.
- Contém pelo menos três dos seguintes tipos de caracteres: letras maiúsculas, letras minúsculas, dígitos e caracteres especiais !@$%^-_=+[{}]:,./?
- Não pode conter o nome de usuário ou o nome de usuário escrito ao contrário.
- Não pode conter o nome de usuário, o nome de usuário escrito para trás ou mais de dois caracteres consecutivos no nome de usuário (para ECSs do Windows).
Python
Para fazer sal de uma senha no ambiente Python 3.7.7, execute as seguintes etapas:
O pacote python crypt tem problemas de compatibilidade no macOS. Se o pacote não puder ser executado, execute-o no Linux.
- Acrescente \ antes de $ do sal. Gere uma senha de texto cifrado com base no sal atualizado.
python3 -c "import crypt;print(crypt.crypt('******', crypt.mksalt()))"
- Codifique o valor do campo password usando Base64.
echo -n '******' | base64 | tr "\n" " " | sed s/[[:space:]]//g
Java
Para fazer sal de uma senha no ambiente Java, execute as seguintes etapas:
- Obtenha um número aleatório como o sal.
private static String getCharAndNumr(int length) { String val = ""; Random random = new SecureRandom(); for (int i = 0; i < length; i++) { // Indicates whether to output letters or digits. String charOrNum = random.nextInt(2) % 2 == 0 ? "char" : "num"; // Character string if ("char".equalsIgnoreCase(charOrNum)) { // Indicates whether an upper-case or lower-case letter is obtained. int choice = random.nextInt(2) % 2 == 0 ? 65 : 97; val += (char) (choice + random.nextInt(26)); } else if ("num".equalsIgnoreCase(charOrNum)) {// Digit val += String.valueOf(random.nextInt(10)); } } return val; }
- Gere um sal.
private static String generateSalt() { String salt; try { salt = "$6$" + getCharAndNumr(16); }catch (Exception e){ salt = defaultSalt; } return salt; }
- Gere uma senha de texto cifrado com base no sal.
public static String getSaltPassword(String password) { if(StringUtils.isBlank(password)) { throw new BizException("password is empty"); } String salt = generateSalt(); Crypt crypt = new Crypt(); return crypt.crypt(password, salt); }
- Codifique o valor do campo password usando Base64.
(Base64.getEncoder().encodeToString(AddSaltPasswordUtil.getSaltPassword(cceNodeCreateVo.getPassword()).getBytes()))
- Um exemplo completo é o seguinte:
import java.util.Base64; import java.util.Random; import java.security.SecureRandom; import org.apache.commons.codec.digest.Crypt; import org.apache.commons.lang.StringUtils; public class PassWord { static String defaultSalt = null; public static void main(String[] args) throws Exception { System.out.println(Base64.getEncoder().encodeToString(PassWord.getSaltPassword("Custom password").getBytes())); } //Generate a ciphertext password based on the salt. public static String getSaltPassword(String password) throws Exception { if(StringUtils.isBlank(password)) { throw new Exception("password is empty"); } String salt = generateSalt(); return Crypt.crypt(password, salt); } //Generate a salt. private static String generateSalt() { String salt; try { salt = "$6$" + getCharAndNumr(16); }catch (Exception e){ salt = defaultSalt; } return salt; } //Obtain a random number as the salt. private static String getCharAndNumr(int length) { String val = ""; Random random = new SecureRandom(); for (int i = 0; i < length; i++) { // Indicates whether to output letters or digits. String charOrNum = random.nextInt(2) % 2 == 0 ? "char" : "num"; // Character string if ("char".equalsIgnoreCase(charOrNum)) { // Indicates whether an upper-case or lower-case letter is obtained. int choice = random.nextInt(2) % 2 == 0 ? 65 : 97; val += (char) (choice + random.nextInt(26)); } else if ("num".equalsIgnoreCase(charOrNum)) {// Digit val += String.valueOf(random.nextInt(10)); } } return val; } }
Go
Você pode usar um dos seguintes métodos para fazer sal de senhas para a linguagem Go: