Arquitectura de tecnología de plataforma de 100 mil millones: para soportar una alta concurrencia, almacené la tarjeta de identificación en JS

@ @


Junto al artículo anterior "Cosas detrás de la plataforma de Internet de 100 mil millones: quiero ir al cielo azul para cubrir la luna" , hoy hablaremos sobre la privacidad de los usuarios.

Con el desarrollo de los tiempos e Internet, las personas prestan cada vez más atención a la privacidad personal, pero el problema de la filtración y el abuso de información privada sigue siendo común. Anteriormente, un "Informe de seguridad de la información personal y protección de la privacidad de China" había extraído 1 millón de datos de encuestas, y el 80% de los usuarios encontraron fugas de privacidad . Por ejemplo, Marriott sufrió una fuga de 383 millones de datos de privacidad en 18 años y luego explotó nuevamente el 31 de marzo de 2020. De 5,2 millones de información de clientes filtrada. La razón detrás de esto es que no hablaremos mucho al respecto. Aparte del comportamiento malicioso de algunas compañías corruptas, debe haber muchos intereses comerciales. Hoy venimos a hablar sobre cómo los desarrolladores deben lidiar con la privacidad del usuario. Recordé que el desarrollador del sistema de consulta de prueba de competencia de Putonghua en una provincia que sabía hace aproximadamente medio año escribió la tarjeta de identificación directamente en J. Algunos internautas se rieron y dijeron que esto es cierto. La separación del front-end y el back-end no es algo que respalde la concurrencia de mil millones de niveles .
Antes de que comience el artículo, se lanza una pequeña pregunta: además del nombre, la tarjeta de identificación, la tarjeta bancaria, el número de teléfono móvil, ¿cuál cree que es la información confidencial del usuario que debe encriptarse y almacenarse?Inserte la descripción de la imagen aquí

¿Qué es información personal y qué es información sensible? ¿Cómo se debe almacenar y mostrar la información personal? ¿El código de canje en el juego contiene información confidencial? ¿Es sensible la información de alojamiento? ? Como excelente desarrollador, no solo podemos centrarnos en el código, no siempre podemos ser el gerente de producto o el gerente de proyecto para permitirme hacer esto, y también debemos dominar el conocimiento comercial de la industria, incluidas las leyes y regulaciones de políticas, para mejorarnos y ampliarnos. Lado del conocimiento empresarial.

1. Especificación de seguridad de la información del usuario

Con respecto a la construcción de sistemas de información, en realidad existen muchos estándares y regulaciones en el país y la industria, como el sistema nacional de divulgación de texto completo estándar ( http://openstd.samr.gov.cn/)). Con respecto a la información personal, la última es "GB / T 35273-2020 Tecnología de seguridad de la información - Especificación de seguridad de la información personal" lanzada este año , que se implementará oficialmente en 2020-10-01 , reemplazando el antiguo estándar GB / T 35273-2017. El documento de especificación completo incorpora principalmente siete principios: el principio de poder y responsabilidad unánimes, el principio de propósito claro, el principio de elección y consentimiento, el principio de lo menos suficiente, el principio de apertura y transparencia, el principio de garantizar la seguridad y el principio de participación del sujeto .
Inserte la descripción de la imagen aquí

1.1 Definición y base de juicio de la información del usuario e información sensible

1.1.1 Información personal

Información personal Se refiere a todo tipo de información registrada de manera electrónica o de otro tipo que puede identificar la identidad de una persona física específica o reflejar las actividades de una persona física específica, sola o en combinación con otra información.

Método de juicio :

  1. Identificación: desde la información hasta los individuos, las personas físicas específicas se identifican por la particularidad de la información en sí misma, que debe ayudar a identificar individuos específicos.
  2. Correlación: de personal a información, si se conoce a una persona física específica, la información (como información de ubicación personal, registros de llamadas personales, registros de navegación personal, etc.) generada por la persona física específica en sus actividades es información personal.
    La información que cumple con una de las dos situaciones anteriores debe determinarse como información personal.

Ejemplos de información personal : Ejemplos de información personal.
Nota : La información formada por el controlador de información personal a través del procesamiento de información personal u otra información, como retratos de usuarios o etiquetas de características, puede identificar la identidad de una persona física específica o reflejar las actividades de una persona física específica sola o en combinación con otra información. También pertenece a la información personal.

1.1.2 Información personal sensible

Información personal sensible. Se refiere a la información personal que una vez que se filtró, se proporcionó ilegalmente o se usó indebidamente, puede poner en peligro la seguridad personal y de la propiedad, fácilmente provocar daños a la reputación personal, la salud física y mental o un trato discriminatorio. En general, la información personal de niños menores de 14 años (inclusive) y la información relacionada con la privacidad de las personas físicas son información confidencial personal .

Método de juicio :

  1. Fugas: una vez que se filtró la información personal, causará que el cuerpo principal de información personal y las organizaciones e instituciones que recopilan y usen la información personal pierdan la capacidad de controlar la información personal, lo que resulta en un alcance y uso incontrolable de la información personal. Después de la filtración, parte de la información personal se usa directamente de una manera contraria a la voluntad del sujeto de información personal o el análisis asociado con otra información, lo que puede traer riesgos significativos para los derechos e intereses del sujeto de información personal, y debe determinarse como información confidencial personal. Por ejemplo, la copia de la tarjeta de identificación del cuerpo principal de información personal es utilizada por otros para el registro del nombre real de una tarjeta de número de teléfono móvil, tarjeta de apertura de cuenta bancaria, etc.

  2. Disposición ilegal: cierta información personal solo puede causar riesgos significativos para los derechos e intereses de los sujetos de información personal porque se difunden fuera del consentimiento autorizado de los sujetos de información personal y deben determinarse como información confidencial personal. Por ejemplo, orientación sexual, información sobre depósitos, antecedentes de enfermedades infecciosas, etc.

  3. Uso indebido: cuando se utiliza cierta información personal más allá del límite razonable de autorización (como cambiar el propósito de procesamiento, ampliar el rango de procesamiento, etc.), puede traer riesgos significativos para los derechos e intereses del sujeto de información personal y debe determinarse como información confidencial personal. Por ejemplo, cuando no se obtiene la autorización del cuerpo principal de información personal, la información de salud se utiliza para la comercialización de la compañía de seguros y para determinar el nivel de las primas individuales.

Ejemplos de información confidencial personal
Ejemplos de información personal sensible.
Nota : La información formada por el controlador de información personal a través del procesamiento de información personal u otra información, tal como GB / T 35273-20206, una vez filtrada, brindada ilegalmente o abusada, puede poner en peligro la seguridad de los bienes personales y de la propiedad, lo que puede conducir fácilmente a la reputación personal. , La salud física y mental está dañada o el tratamiento discriminatorio, etc., es información personal sensible.

1.2 Notas sobre el almacenamiento de información del usuario

  1. Se minimiza el tiempo de almacenamiento de la información personal. Después de que se excede el período de almacenamiento de la información personal, la información personal debe eliminarse o anonimizarse.
  2. Cuando se transmite y almacena información personal confidencial, se debe adoptar cifrado y otras medidas de seguridad; cuando se usa tecnología criptográfica, es aconsejable seguir los estándares nacionales relevantes para el manejo de contraseñas.
  3. La información biométrica personal debe almacenarse por separado de la información de identidad personal ;
  4. En principio, no debe ser original almacenada la información biométrica personal (por ejemplo, muestras, imágenes, etc.) , se pueden tomar medidas incluyen, pero no se limitan a: información de identificación biométrica personal sólo la información de resumen almacenada; implementada utilizando la identificación del terminal de recopilación de información biométrica personal directamente en el , Autenticación y otras funciones; después de usar las funciones de reconocimiento facial, huellas digitales, huellas de las manos, iris, etc. para lograr la identificación, autenticación y otras funciones, elimine la imagen original que puede extraer información biométrica personal.

El documento de especificación completo también menciona el uso, la visualización, el acceso de terceros, la gestión de seguridad, etc. de la información del usuario. Los socios interesados ​​pueden buscarla por sí mismos.

Segundo, la implementación de la tecnología marco.

2.1 Cifrado automático y descifrado de información confidencial del usuario

Como se mencionó en el primer capítulo, el nombre real del usuario, el número de teléfono móvil, el número de la tarjeta bancaria y la información confidencial, incluido el alojamiento, deben cifrarse y almacenarse en la base de datos, y luego convertirse en datos de texto sin formato cuando la empresa está en uso normal. Desde el punto de vista de la implementación técnica, no es más que cifrar al agregar, editar y descifrar al realizar consultas. Estas operaciones siguen siendo relativamente bajas, y es probable que algún día se agregue un nuevo método y se olvide de cifrar y descifrar. Entonces, la mayoría de ellos se implementarán a través del marco, y el principio de implementación no es más que máquina de reflexión + interceptor. A continuación, tome Mybatis como ejemplo, el principio es el siguiente, para referencia específica: https://blog.csdn.net/weixin_39494923/article/details/91534658
Inserte la descripción de la imagen aquí

2.1.1 Cifrado y descifrado automático de datos a través de Interceptor

Mybatis proporciona una interfaz interceptor Interceptor de forma predeterminada, la mayoría de las herramientas mejoradas de Mybatis se implementan a través de esta interfaz. Si desea implementar un interceptor personalizado, solo necesita implementar la interfaz org.apache.ibatis.plugin.Interceptor, que tiene tres métodos:

Object intercept(Invocation invocation) throws Throwable;

Object plugin(Object target);

void setProperties(Properties properties);

Primero, se usa una anotación personalizada @Crypt, que actúa en el campo, para decirle al interceptor que el campo necesita ser encriptado y desencriptado.

@Target({ ElementType.FIELD,ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface Crypt {

}

Luego, agregue un interceptor personalizado, descifre cuando use el método selelct y encripte cuando use los métodos de actualización y agregar.

@Intercepts({ @Signature(type = Executor.class, method = "update", args = { MappedStatement.class, Object.class, }),
        @Signature(type = Executor.class, method = "query", args = { MappedStatement.class, Object.class,
                RowBounds.class, ResultHandler.class }),
        @Signature(type = ResultSetHandler.class, method = "handleResultSets", args = { Statement.class }) })
public class CryptInterceptor implements Interceptor {

    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        Object[] args = invocation.getArgs();
        if (args.length <= 0 || invocation.getMethod() == null || args[0] == null) {
            return invocation.proceed();
        }

        String methodName = invocation.getMethod().getName();
        if ("update".equals(methodName) && args[1] != null) {
            return this.interceptUpdate(invocation);
        } else if ("query".equals(methodName) && args[1] != null) {
            return this.interceptQuery(invocation);
        } else if ("handleResultSets".equals(methodName)) {
            return this.interceptHandleResultSets(invocation);
        }
        return invocation.proceed();
    }

    private Object interceptHandleResultSets(Invocation invocation) throws Throwable {
        Object resultCollection = invocation.proceed();
        // 略 将resultCollection的对象中有@Crypt注解的Feild进行解密
        return newObject;
    }

    private Object interceptUpdate(Invocation invocation) throws Throwable {
        Object[] args = invocation.getArgs();
        Object args1Obj = args[1];
        // 略 将args1Obj的对象进行加密
        args[1] = newObject;
        return invocation.proceed();
    }
    
    private Object interceptQuery(Invocation invocation) throws Throwable {
        Object[] args = invocation.getArgs();
        Object condition = args[1];
        // 略 将condition对象进行解密
        args[1] = newObject;
        return invocation.proceed();
    }    
}

2.1.2 Cifrado y descifrado automático de datos a través de BaseTypeHandler

En circunstancias normales, la interfaz Interceptor no interceptará las solicitudes de Mybatis, a menos que existan algunos requisitos complejos como "separación de lectura y escritura". Vea el proceso de ejecución de mybatis arriba, encontramos que el último paso llamado TypeHander, el papel de esta clase es realizar la conversión de tipos entre la base de datos y la entidad, como la conversión de MySql varchar a Java Long y Java Integer a Mysql int, para que podamos usar la clase BaseTypeHandler.

@Component
@Alias("CryptHandler")
@MappedTypes(value = {Crypt.class})
public class EncryptHandler extends BaseTypeHandler {

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType)
        throws SQLException {
        ps.setString(i, encrypt(parameter.toString()));
    }

    @Override
    public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
        String columnValue = rs.getString(columnName);
        return decrypt(columnValue);
    }

    @Override
    public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        String columnValue = rs.getString(columnIndex);
        return decrypt(columnValue);
    }

    @Override
    public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        String columnValue = cs.getString(columnIndex);
        return decrypt(columnValue);
    }

    private String encrypt(String parameter) {
        // 加密
        return parameter;
    }

    private String decrypt(String columnValue) {
        // 解密
        return columnValue;
    }
}

Vea arriba el código completo, así que no entraré en más detalles. A continuación, debo decirle a Mybatis qué campos deben cifrarse y descifrarse. Para simplificar la escritura, defina una clase Cripta renombrada a cripta, la clase anterior EncryptHandler también renombrada a EncryptHandler

@Alias("crypt")
public final class Crypt {

}

Las dos clases anteriores se colocan en el directorio cn.itmds.plugin, el archivo de configuración yml le dice a Mybatis que lea la configuración renombrada

mybatis:
  type-aliases-Package: cn.itmds.plugin.dbcrypt
 

A continuación, supongamos que hay una tabla de miembros cuyo campo de nombre real (nombre real) necesita ser encriptado y desencriptado, es muy simple de escribir:

 <sql id="memberConditionSql">
        <where>
            <if test="id != null">and id = #id}</if>
            <!--这个地方只需要指定javaType=crypt,如果上面没有重命名,这个地方需要写成javaType= cn.itmds.plugin.dbcrypt.Crypt,写起来比较麻烦 -->
            <if test=realName != null">and real_name = #{realName,javaType=crypt}</if>
        </where>
    </sql>
    <resultMap id="memberDOResultMap" type="MemberDO">
        <!--这个地方只需要指定typeHandler=CryptHandler,如果上面没有重命名,这个地方需要写成javaType= cn.itmds.plugin.dbcrypt.CryptHandler,写起来比较麻烦 -->
        <!--另外,只需要将需要解密的字段写到这个resultMap里即可,不需要写全部的字段,其他字段系统会自动映射为MemberDO -->
        <result column="phone" property="phone" typeHandler="CryptHandler"/>
    </resultMap>

2.1.3 MybatisPlus realiza el cifrado y descifrado automático de datos

MyBatis-Plus (abreviado como MP) es una herramienta de mejora de MyBatis. Sobre la base de MyBatis, solo se realizan mejoras y ningún cambio. Nace para simplificar el desarrollo y mejorar la eficiencia.

Con una configuración simple, MyBatis-Plus puede realizar rápidamente operaciones CRUD, ahorrando mucho tiempo. Y también admite expresiones Lambda, manipulación de SQL, etc. a través de objetos, por lo que cada vez más personas lo usan. Entonces, ¿cómo puede lograr el cifrado y descifrado automático de datos, súper simple? El principio de realización es el mismo que en 2.1.2, pero también a través de BaseTypeHandler.

1. Agregado @TableField(typeHandler = EncryptHandler.class), donde EncryptHandler se define en 2.1.2, EncryptHandler.javay el cifrado automático se implementa al agregar o modificar.
2. Establezca en @TableName autoResultMap = true, en este momento se realiza el descifrado automático del valor de retorno.

Hecho Ejemplos:

@Data
@TableName(value = "user_info",autoResultMap = true)
public class UserPO {

    /**  */
    @TableId(type = IdType.AUTO)
    private Long id;

    /** 真实姓名 */
    @TableField(typeHandler = EncryptHandler.class)
    private String realName;
}

2.2 Los archivos de registro filtran automáticamente la información confidencial del usuario

Para facilitar el desarrollo y la depuración y para localizar problemas de la línea de producción, el marco de desarrollo básicamente definirá un interceptor de registros, interceptará todos los métodos de la capa de controlador y la capa de servicio e imprimirá parámetros detallados de entrada y salida. En 2.1, mencionamos que el cifrado y descifrado de la información confidencial del usuario se realiza automáticamente en la parte inferior del dao, por lo que también hace que la información confidencial del usuario se imprima en el registro. Luego, proporcione un caso completo.

  1. Defina una anotación @ServiceLog, que se puede aplicar a la clase o método. Proporcione un parámetro: ignore, el valor predeterminado es falso. Si es verdadero, significa que el método no necesita imprimir registros. Por ejemplo, hay muchos métodos en una determinada clase que requieren registros, pero uno de los métodos se usa para cargar archivos o las tareas programadas se ejecutan una vez por segundo. En estos escenarios, no es necesario imprimir registros, puede establecer ignore = true.
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ServiceLog {

    boolean ignore() default false;
}
  1. Defina un interceptor global, imprima el registro de entrada y salida, use FastJson para convertir el objeto en una cadena.
@Aspect
@Component
public class ServiceLogAspect {

	@Around("@within(cn.itmds.log.ServiceLog)")
    protected Object aroundJoinPoint(ProceedingJoinPoint joinPoint) throws Throwable {
        MethodSignature signature = (MethodSignature)joinPoint.getSignature();
        Method method = signature.getMethod();
        ServiceLog serviceLog = method.getAnnotation(ServiceLog.class);
        if (null != serviceLog && serviceLog.ignore()) {
            return joinPoint.proceed();
        }
        long beginTime = System.currentTimeMillis();
        Class clazz = joinPoint.getTarget().getClass();
        String methodName = clazz.getSimpleName() + "." + method.getName();
        // 打印请求所有的入参
        log.info("Begin|{}|{}", methodName, jsonString(joinPoint.getArgs()));

        Object result = null;
        try {
            result = joinPoint.proceed();
        } finally {
        	// 打印所有的出参
            log.info("End|{}|{}ms|{}", methodName, System.currentTimeMillis(),
            	 - beginTime, jsonString(result));
        }
        return result;
    }
}

  1. Agregue un elemento de configuración para definir la información confidencial que se filtrará, como nombre real, número de teléfono móvil, tarjeta de identificación, contraseña, etc.
logging:
  sensitiveChars: realName,phoneNumber,idCard,mail,password
  1. A continuación, podemos usar la función de filtro de FastJSON para filtrar los registros.
    private ValueFilter valueFilter = (object, name, value) -> {
        if (null == value || "".equals(value)) {
            return value;
        }

        if (value instanceof byte[]) {
            // 如果是byte字节,直接打印长度
            return "byte length:" + ((byte[])value).length;
        } else if (value instanceof String) {
            // 在该方法里检查name,如果name包含我们配置的敏感信息,则将value设置为加*隐藏。
            return stringValueProcess(name, (String)value);
        } else {
            return value;
        }
    };

En el método del interceptor del segundo paso alrededor de JoinPoint, cuando el objeto se convierte en String, se usa el filtro FastJSON.

    protected String jsonString(Object object) {
        return JSON.toJSONString(object, valueFilter);
    }
  1. La capa del controlador es similar, intercepte todos los archivos en el directorio del controlador.
@Around("execution(public * cn.itmds.controller..*(..) )")

El controlador debe prestar atención a este método, ya que algunos campos de solicitud http y solicitud de respuesta no se pueden serializar, por lo que deben filtrarse.

public static <T> Stream<T> streamOf(T[] array) {
        return ArrayUtils.isEmpty(array) ? Stream.empty() : Arrays.asList(array).stream();
    }

//... 拦截器的方法中增加过滤
 List<Object> logArgs = (List)streamOf(args).filter((arg) -> {
                return !(arg instanceof HttpServletRequest) && !(arg instanceof HttpServletResponse);
            }).collect(Collectors.toList());
// 打印请求所有的入参
log.info("Begin|{}|{}", methodName, jsonString(logArgs));

2.3 Cifrado de contraseña y "Ley de contraseña"

Con respecto a las contraseñas, el país también tiene una "Ley de criptografía", que parece estar siendo promovida recientemente. Por supuesto, el nombre de usuario "contraseña" que usualmente decimos es solo una "contraseña", no una "contraseña" en criptografía. El alcance del uso de contraseñas en la "Ley de Contraseñas" incluye tarjetas de identificación de segunda generación, firmas electrónicas, áreas de contraseñas de facturas con IVA y similares. Para más detalles, puede ir al texto completo y no hablar sobre ello.
Inserte la descripción de la imagen aquí

2.3.1 Notas sobre el cifrado de contraseña

Los desarrolladores de hoy en día básicamente tienen cierto conocimiento de seguridad. Pocas contraseñas se almacenan en texto plano, e incluso md5 directo son pocas. La mayoría de ellas han comenzado a usar sha1 y sha256, y algunas compañías han comenzado a usar Argon2.

Argon2 es una función lenta de hash. Ganó el campeonato de Password Hashing Competition en 2015. Utiliza muchos cálculos de memoria para resistir GPU y otras grietas de hardware personalizadas, mejorando la seguridad de los resultados de hash.

Aquí hay algunos puntos:

  1. Cada contraseña debe agregarse con una sal diferente para garantizar que la misma contraseña también genere hashes diferentes. Por ejemplo, las contraseñas de ambas personas son abcd1234, y el hash generado debe ser diferente.
  2. No use un algoritmo aleatorio ordinario para generar sal, debe usar CSPRNG (Generador de números pseudoaleatorios criptográficamente seguro); el java correspondiente es Java.security.SecureRandom, correspondiente a C / C ++ CryptGenRandom.
  3. Algunos sistemas utilizan la identificación del usuario, el número de teléfono móvil, etc. como contraseña de cifrado de sal, que no cumple con las reglas de generación de sal. Pero para los requisitos de seguridad generales del sitio no es tan alto, básicamente se puede utilizar.

2.3.2 Usar BCrypt para implementar el cifrado de contraseña

Bcrypt es una herramienta de cifrado de archivos multiplataforma, y ​​SpringSecurity usa este algoritmo de manera predeterminada. Si SpringSecurity no está en el proyecto, también puede importar el paquete jar por separado. Hay una gran diferencia entre el algoritmo bcrypt y el algoritmo md5 / sha, es decir, el valor hash generado cada vez es diferente y no necesitamos especificar la sal nosotros mismos. La longitud de los caracteres después del cifrado es relativamente larga, hay 60 bits, a los que debemos prestar atención al diseñar el campo de la base de datos. Los ejemplos son los siguientes:

    public static void main(String[] args) {
        BCryptPasswordEncoder bcrypt = new BCryptPasswordEncoder();
        String pwd = "abcd1234";
        for (int i = 0; i < 5; i++) {
            String encodePwd = bcrypt.encode(pwd);
            boolean result = bcrypt.matches(pwd, encodePwd);
            System.out.println(encodePwd + "|" + result);
        }
    }

Inserte la descripción de la imagen aquí
El valor de la cadena cifrada consta de :

  • $ Es un separador, sin sentido;
  • 2a es el número de versión cifrado de bcrypt;
  • 10 es el valor del costo;
  • En la siguiente cadena, los primeros 22 dígitos son el valor de sal; la siguiente cadena es el texto cifrado de la contraseña.

Los interesados ​​pueden consultar el código fuente.

public static String gensalt(int log_rounds, SecureRandom random) {
		if (log_rounds < MIN_LOG_ROUNDS || log_rounds > MAX_LOG_ROUNDS) {
			throw new IllegalArgumentException("Bad number of rounds");
		}
		StringBuilder rs = new StringBuilder();
		byte rnd[] = new byte[BCRYPT_SALT_LEN];

		random.nextBytes(rnd);

		rs.append("$2a$");
		if (log_rounds < 10) {
			rs.append("0");
		}
		rs.append(log_rounds);
		rs.append("$");
		encode_base64(rnd, rnd.length, rs);
		return rs.toString();
	}

2.3.3 Prevención de almacenamiento de cifrado de contraseña de Dropbox

Dropbox es un famoso fabricante que ofrece almacenamiento en línea de archivos y ha publicado un artículo llamado "Cómo Dropbox almacena de forma segura sus contraseñas" en su blog técnico oficial, que describe su solución de almacenamiento de cifrado de contraseña de usuario.
Inserte la descripción de la imagen aquí

  1. Primero use sha512 para normalizar la contraseña del usuario a un valor hash de 64 bytes. Por dos razones: una es que Bcrypt es sensible a la entrada. Si la contraseña ingresada por el usuario es larga, puede hacer que Bcrypt sea demasiado lenta y afectar el tiempo de respuesta; otra es que algunas implementaciones del algoritmo Bcrypt truncarán directamente la entrada larga a 72 bytes. Desde la perspectiva de la teoría de la información, esto hace que la entropía de la información del usuario se reduzca;
  2. Luego usa el algoritmo Bcrypt. La razón para elegir Bcrypt es que los ingenieros de Dropbox están más familiarizados con este algoritmo y tienen más experiencia en el ajuste. El estándar para la selección de parámetros es que el servidor API en línea de Dropbox puede calcular el resultado en aproximadamente 100 ms. Además, en cuanto a qué algoritmo es mejor, Bcrypt o Scrypt, los criptógrafos tampoco son concluyentes. Al mismo tiempo, Dropbox también está prestando atención al novato de algoritmo hash de contraseña Argon2, y dijo que se introducirá en el momento adecuado;
  3. Finalmente use el cifrado AES. Debido a que Bcrypt no es un algoritmo perfecto, Dropbox utiliza AES y claves globales para reducir aún más el riesgo de descifrado de contraseñas. Para evitar la fuga de claves, Dropbox utiliza hardware de almacenamiento de claves dedicado. Dropbox también mencionó otra ventaja de usar el cifrado AES al final, es decir, la clave se puede cambiar regularmente para reducir el riesgo de pérdida de información / clave del usuario.

La protección de la privacidad del usuario está lejos de ser tan simple como el cifrado y descifrado por parte de los desarrolladores, pero también requiere la cooperación de todos los aspectos de las operaciones y los equipos de operación y mantenimiento.

[La gente siempre quiere dejar algo de espacio de privacidad para sí misma
, al igual que siempre estarás parado frente a tu sombra para bloquear la vista de la luz] La gente siempre quiere tener algo de espacio de privacidad, al igual que siempre estarás parado frente a la sombra de ti bloqueando la línea de visión de la luz.

Referencia:
https://www.cnblogs.com/xinzhao/p/6035847.html
https://blog.csdn.net/weixin_39494923/article/details/91534658


Arquitecto, diez años Rong [código], viejo [tío] floración. WeChat personal: qiaojs, centrándose en el diseño de arquitectura, big data, microservicios y gestión de tecnología.
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin www.cnblogs.com/madashu/p/12735752.html
Recomendado
Clasificación