深入理解MD5:Message Digest Algorithm 5

news2024/11/16 3:19:40

title: 深入理解MD5:Message Digest Algorithm 5
date: 2024/4/21 18:10:18
updated: 2024/4/21 18:10:18
tags:

  • MD5
  • 哈希函数
  • 密码学
  • 数据完整性
  • 碰撞攻击
  • 安全性
  • 替代算法

在这里插入图片描述

导论

MD5的背景和历史

MD5(Message Digest Algorithm 5)是一种广泛使用的哈希函数,用于产生128位(16字节)的哈希值,通常以32个十六进制数字表示。它由Ronald Rivest于1991年设计,并在RFC 1321中进行了描述。

MD5的设计目的是为了提供数据完整性验证和消息认证。它被广泛应用于数字签名、消息认证码(MAC)、密码学散列函数等领域。在早期,MD5曾被广泛用于密码存储、数字证书、软件完整性验证等方面。

MD5的应用领域
  1. 密码学:MD5常用于密码存储,通过将用户密码的MD5哈希值存储在数据库中,而不是明文密码,以增加安全性。然而,由于MD5存在安全性问题,现已被更安全的哈希函数如SHA-256所取代。
  2. 数据完整性验证:MD5可用于验证文件的完整性,通过比较文件的MD5哈希值,确保文件在传输或存储过程中未被篡改。
  3. 数字签名:在一些早期的应用中,MD5曾用于生成数字签名,用于验证文件的来源和完整性。然而,由于MD5的碰撞攻击,这种用法已经不再安全。
  4. 消息认证码(MAC) :MD5可以用于生成消息认证码,用于验证消息的完整性和来源。
MD5的特点和安全性问题
  1. 快速计算:MD5的计算速度相对较快,适用于对大量数据进行哈希计算。

  2. 固定长度输出:MD5生成的哈希值长度固定为128位,无论输入数据的长度如何,始终生成相同长度的哈希值。

  3. 安全性问题:然而,MD5在安全性上存在严重问题,主要表现在以下几个方面:

    • 碰撞攻击:MD5已经被证明存在碰撞攻击,即找到两个不同的输入,但生成相同的MD5哈希值。这种情况下,攻击者可以伪造数字签名或通过篡改数据而不改变哈希值来绕过完整性检查。
    • 预图攻击:MD5也容易受到预图攻击,即通过已知的输入和输出对来推导出其他输入的哈希值。
    • 彩虹表攻击:MD5哈希值的空间相对较小,容易受到彩虹表攻击,即通过事先计算好的哈希值与明文的对应关系表,从而快速破解密码。

由于MD5的安全性问题,现在已经不再建议将其用于安全敏感的应用中,而应该选择更安全的哈希函数如SHA-256等。

MD5算法原理

MD5算法的概述

MD5(Message Digest Algorithm 5)是一种哈希函数,用于生成128位(16字节)的哈希值。其设计目的是为了提供数据完整性验证和消息认证。MD5算法将任意长度的输入数据转换为固定长度的128位哈希值,且输出的哈希值在理想情况下是唯一的。

MD5算法的流程和步骤

MD5算法的流程主要包括以下步骤:

  1. 填充数据:将输入数据进行填充,使其长度满足512位(64字节)的倍数,通常采用的填充方式是在数据末尾添加一个1和若干个0,以及数据长度的二进制表示。
  2. 初始化变量:初始化四个32位的寄存器A、B、C、D,这些寄存器用于存储中间计算结果。
  3. 分块处理:将填充后的数据按照512位(64字节)一块进行处理,每块包含16个32位字。
  4. 循环压缩函数处理:对每个512位的数据块进行四轮循环压缩函数处理,每轮处理包括四个步骤:F函数G函数H函数I函数
  5. 更新寄存器:根据每轮的计算结果更新寄存器A、B、C、D的值。
  6. 生成哈希值:经过所有数据块的处理后,将四个寄存器的值连接起来,按照A、B、C、D的顺序将每个寄存器的值转换为16进制表示,即得到128位的MD5哈希值。
MD5算法中使用的运算函数

MD5算法中使用了四个非线性函数,分别为F、G、H、I函数,这些函数在循环压缩函数处理中起着重要作用:

  1. F函数: F函数采用的是逻辑与(AND)、逻辑或(OR)、逻辑非(NOT)和异或(XOR)操作,用于混淆数据块中的数据。
  2. G函数: G函数也是采用与F函数类似的操作,用于进一步混淆数据块中的数据。
  3. H函数: H函数同样采用逻辑与、逻辑或和异或操作,用于增加数据块的复杂性。
  4. I函数: I函数也是一种非线性函数,用于增加数据块的随机性,增强MD5算法的安全性。

这些运算函数的设计使得MD5算法具有较好的扩散性和抗碰撞能力,但由于现代计算能力的提升和MD5算法本身的设计缺陷,使得MD5算法已经不再安全。

MD5算法细节

消息填充和处理

在MD5算法中,消息填充的目的是将输入数据填充至512位(64字节)的倍数,并在数据末尾添加一个长度信息。填充的具体步骤如下:

  1. 首先将数据长度表示为二进制形式,并附加到数据的末尾。
  2. 在数据末尾添加一个’1’比特,然后填充0直到数据长度满足对512取模的结果为448(即数据长度模512等于448)。
  3. 将数据长度(64位)附加到填充后的数据末尾,以二进制表示。
循环函数和常量

MD5算法中使用了四个循环函数(F、G、H、I)和64个常量。这些函数和常量是在循环压缩函数处理过程中使用的。循环压缩函数中的每一轮都会使用不同的常量和循环函数。

  1. F函数:F函数采用了非线性函数𝐹(𝑋,𝑌,𝑍)=(𝑋∧𝑌)∨(¬𝑋∧𝑍)。
  2. G函数:G函数采用了非线性函数𝐺(𝑋,𝑌,𝑍)=(𝑋∧𝑍)∨(𝑌∧¬𝑍)。
  3. H函数:H函数采用了非线性函数𝐻(𝑋,𝑌,𝑍)=𝑋⊕𝑌⊕𝑍。
  4. I函数:I函数采用了非线性函数𝐼(𝑋,𝑌,𝑍)=𝑌⊕(𝑋∨¬𝑍)。

在MD5算法中,每轮循环使用的常量是通过对2^32的整数部分取绝对值后的正弦函数计算得到的。这些常量用于增加算法的非线性性质和扩散性。

消息分组和处理流程

MD5算法将输入数据按512位(64字节)分组,并对每个512位数据块进行处理。处理流程如下:

  1. 初始化寄存器:将四个32位寄存器(A、B、C、D)初始化为特定的常量值。
  2. 分组处理:将填充后的数据分成若干个512位的数据块,对每个数据块进行循环压缩函数处理。
  3. 循环压缩函数处理:对每个数据块进行四轮循环处理,每轮处理包括16次操作。在每一轮中,使用一个常量和一个消息块的子分组作为输入,并对寄存器进行更新。
  4. 更新寄存器:每轮处理后,根据计算结果更新寄存器的值。
  5. 生成哈希值:经过所有数据块的处理后,将四个寄存器的值连接起来,并将每个寄存器的值转换为16进制表示,即得到128位的MD5哈希值。

这样,MD5算法通过一系列的数据处理步骤,将任意长度的输入数据转换为128位的哈希值,以实现数据的完整性验证和消息认证。

MD5碰撞攻击

原理

MD5碰撞攻击的原理基于MD5算法的弱点,主要包括以下两点:

  1. 碰撞攻击的原理:MD5算法的输出空间远远小于输入空间,这导致了可能性的碰撞。MD5算法的输出长度是128位,因此存在着不同的输入会产生相同的输出(哈希碰撞)。攻击者利用这一特性,通过精心构造的两个不同的输入数据,使得它们的MD5哈希值相同,即产生了碰撞。
  2. 哈希碰撞的搜索:MD5算法的设计存在缺陷,使得寻找碰撞不需要遍历所有可能的输入组合。攻击者可以利用已知的碰撞片段,通过巧妙的方式生成具有相同哈希值的两个不同输入。这通常涉及对MD5算法的内部结构和碰撞寻找技术的深入理解。
实例分析

经典的MD5碰撞攻击实例是2004年Wang等人发表的《Finding Collisions in the Full SHA-1》。在这项研究中,他们展示了如何在SHA-1算法上实现碰撞攻击,并利用类似的技术攻击了MD5。他们使用了巧妙的算法和大量计算资源,成功地生成了两个具有相同MD5哈希值的不同输入。

针对MD5碰撞攻击的防范措施

尽管MD5算法已经被广泛认为不安全,并且不建议在安全敏感的场景中使用,但在实际应用中,有时仍然需要对其进行防范。以下是一些针对MD5碰撞攻击的防范措施:

  1. 停止使用MD5:首先,避免在安全相关的应用中使用MD5算法。应当选择更安全的哈希算法,如SHA-256或SHA-3。
  2. 使用盐值:对于需要使用MD5的场景,应当使用盐值(salt)来增加哈希的随机性。盐值是一个随机的字符串,与原始数据一起进行哈希运算,可以有效防止彩虹表攻击。
  3. 使用消息认证码(MAC) :对于需要数据完整性保护的场景,应当使用消息认证码(MAC)来代替简单的哈希算法。MAC结合了哈希函数和密钥,提供了更高级别的安全保护。
  4. 更新算法:如果无法立即停止使用MD5,至少应当对现有系统进行更新,以使用更安全的哈希算法。

总的来说,MD5碰撞攻击已经被广泛认为是不安全的,应当尽可能避免在安全敏感的场景中使用MD5算法,并采取必要的防范措施以保护数据安全。

MD5在实际应用中的使用

数据完整性校验

MD5常被用于数据完整性校验,特别是在文件传输过程中。发送方计算文件的MD5哈希值,并将其与接收方计算的哈希值进行比较,以确保文件在传输过程中未被篡改。虽然MD5在这种场景下被广泛使用,但由于其碰撞攻击的漏洞,已经不再是最佳选择。

import hashlib

def calculate_md5(file_path):
    with open(file_path, 'rb') as f:
        content = f.read()
        md5_hash = hashlib.md5(content).hexdigest()
    return md5_hash

# 计算文件的MD5哈希值
file_path = 'example_file.txt'
md5_hash = calculate_md5(file_path)
print("MD5哈希值:", md5_hash)
密码存储和验证

在过去,MD5常被用于密码存储,通常是在数据库中存储用户密码的哈希值。然而,由于MD5容易受到碰撞攻击,现在不再推荐将其用于密码存储。推荐使用更安全的哈希算法,如bcrypt或Argon2。

import hashlib

def hash_password(password):
    # 添加盐值
    salted_password = password + 'mysalt'
    hashed_password = hashlib.md5(salted_password.encode()).hexdigest()
    return hashed_password

def verify_password(input_password, stored_password):
    return hash_password(input_password) == stored_password

# 存储密码
password = 'mypassword'
hashed_password = hash_password(password)

# 验证密码
input_password = 'mypassword'
if verify_password(input_password, hashed_password):
    print("密码正确")
else:
    print("密码错误")
数字签名和认证

MD5也曾经被用于数字签名和认证,用于验证数据的完整性和真实性。然而,由于其安全性问题,现在不再建议在这种敏感场景中使用MD5算法。

在实践中,应使用更安全的哈希算法,如SHA-256或SHA-3,以确保数字签名和认证的安全性。

import hashlib

def create_signature(data):
    hashed_data = hashlib.sha256(data.encode()).hexdigest()
    return hashed_data

# 创建数字签名
data = 'important_data'
signature = create_signature(data)
print("数字签名:", signature)

总的来说,尽管MD5在过去被广泛使用,但现在由于其安全性问题,应尽可能避免在敏感场景中使用,并选择更安全的替代方案。

MD5的替代算法

SHA系列算法

SHA(安全哈希算法)系列是MD5的替代方案,提供了更高的安全性。SHA-1、SHA-256、SHA-384和SHA-512是其中最常见的几种。

  1. SHA-1 (Secure Hash Algorithm 1) : SHA-1是MD5的后继者,拥有160位的哈希值,通常用于数字签名和证书中。
  2. SHA-256 (Secure Hash Algorithm 256) : SHA-256产生256位的哈希值,比SHA-1更安全,常用于数据完整性验证、密码存储和数字签名。
  3. SHA-384 (Secure Hash Algorithm 384) : SHA-384生成384位的哈希值,适用于安全性要求较高的场景,如金融和政府领域。
  4. SHA-512 (Secure Hash Algorithm 512) : SHA-512生成512位的哈希值,提供更高的安全性,适用于对安全性要求极高的应用。
import hashlib

def sha256_hash(data):
    hashed_data = hashlib.sha256(data.encode()).hexdigest()
    return hashed_data

# 使用SHA-256哈希算法
data = 'important_data'
sha256_hashed_data = sha256_hash(data)
print("SHA-256哈希值:", sha256_hashed_data)
新兴的哈希算法

除了SHA系列算法外,还有一些新兴的哈希算法在不断发展和应用中,其中一些包括:

  1. BLAKE2: BLAKE2是一种高速、安全的哈希函数,具有与MD5和SHA-3相似的速度,但提供了更高的安全性。它适用于数据完整性校验、密码存储等场景。
from hashlib import blake2b

def blake2_hash(data):
    h = blake2b(data.encode(), digest_size=32)
    return h.hexdigest()

# 使用BLAKE2哈希算法
data = 'important_data'
blake2_hashed_data = blake2_hash(data)
print("BLAKE2哈希值:", blake2_hashed_data)
安全性更高的替代方案

除了哈希算法外,对于特别安全性要求高的场景,可以考虑使用加密哈希函数或密码哈希函数,如bcrypt和Argon2。这些算法不仅提供了哈希功能,还包含了额外的安全机制,如随机盐和迭代次数,以抵御暴力破解和彩虹表攻击。

import bcrypt

def bcrypt_hash_password(password):
    hashed_password = bcrypt.hashpw(password.encode(), bcrypt.gensalt())
    return hashed_password

def bcrypt_verify_password(input_password, hashed_password):
    return bcrypt.checkpw(input_password.encode(), hashed_password)

# 使用bcrypt哈希算法存储和验证密码
password = 'mypassword'
hashed_password = bcrypt_hash_password(password)

input_password = 'mypassword'
if bcrypt_verify_password(input_password, hashed_password):
    print("密码正确")
else:
    print("密码错误")

总的来说,选择哈希算法应根据具体应用场景和安全需求,对于不同的需求,可以选择适合的替代方案以提高安全性。

MD5的未来发展

MD5在密码学中的地位

MD5(Message Digest Algorithm 5)是一种广泛使用的哈希算法,但它在密码学中的地位已经逐渐下降。原因在于MD5存在严重的安全漏洞,易受到碰撞攻击和预图攻击的影响。因此,在安全性要求较高的领域,如密码存储和数字签名,不推荐使用MD5。

MD5的安全性评估

MD5的安全性已经受到广泛的评估,并被证明是不安全的。主要的安全问题包括:

  1. 碰撞攻击:MD5已经被证明容易受到碰撞攻击,即找到两个不同的输入产生相同的哈希值,这会对数据完整性和身份验证造成严重威胁。
  2. 预图攻击:MD5也容易受到预图攻击,攻击者可以根据已知的哈希值推导出对应的输入,这使得MD5不适合用于密码存储等安全敏感场景。
MD5的未来走向和发展趋势

考虑到MD5存在的严重安全问题,它的未来走向主要集中在以下几个方面:

  1. 淘汰和替代:由于MD5的安全性已经受到广泛认可,大多数安全专家和组织已经不再推荐使用MD5。取而代之的是更安全的哈希算法,如SHA-256、SHA-3等。
  2. 后续研究:尽管MD5不再被视为安全的哈希算法,但仍然有一些研究人员致力于分析MD5的碰撞攻击和预图攻击,以深入理解其安全性漏洞,并从中得出更深层次的密码学洞见。
  3. 历史价值:尽管MD5不再适用于安全敏感的应用,但它仍然具有一定的历史价值,可以用于非安全性要求且对速度要求较高的场景,如数据完整性校验和非关键性数据的哈希。

总的来说,MD5已经逐渐被淘汰,未来的发展趋势主要集中在其替代方案的研究和应用上,以提高密码学的安全性和可靠性。

附录

MD5在线加密 | 一个覆盖广泛主题工具的高效在线平台(amd794.com)
https://amd794.com/md5

MD5算法的伪代码实现

以下是MD5算法的简化伪代码实现:

初始化变量:
A = 0x67452301
B = 0xEFCDAB89
C = 0x98BADCFE
D = 0x10325476

对消息进行填充和长度扩展:
padding 消息 M 使其长度 (bits) 为 448 mod 512
在消息末尾添加一个 1,然后添加足够的 0,直到消息长度为 64 bits 不足 512 bits 的倍数
在消息末尾添加 64 bits 表示消息长度(原始长度)

对填充后的消息进行处理:
将消息分为512位的块,并对每个块执行以下操作:
    将当前块分为16个32位字
    初始化四个32位寄存器:A,B,C,D

    主循环:
    对每个消息块进行64轮迭代处理:
        根据当前轮数选择不同的F函数、索引值和位移数
        更新寄存器A,B,C,D的值

    更新最终哈希值:
    将最终的A,B,C,D寄存器值连接成一个128位哈希值

返回哈希值
MD5算法的Python实现示例

下面是一个简单的Python示例,展示了如何使用Python实现MD5算法:

import hashlib

def calculate_md5(message):
    hash_object = hashlib.md5(message.encode())
    md5_hash = hash_object.hexdigest()
    return md5_hash

# 示例用法
message = "Hello, MD5!"
md5_hash = calculate_md5(message)
print("MD5 哈希值:", md5_hash)
MD5算法的安全性分析

MD5算法存在严重的安全漏洞,主要包括碰撞攻击和预图攻击。这些安全漏洞已经被广泛研究和验证,并且已经有实际攻击案例。

碰撞攻击是指找到两个不同的输入消息,但它们经过MD5哈希后产生相同的哈希值。这使得攻击者可以伪造具有相同哈希值的消息,这对于数字签名和身份验证等场景具有严重的安全威胁。

预图攻击是指根据已知的MD5哈希值,推导出与之对应的原始消息。虽然这种攻击比碰撞攻击更困难,但仍然是MD5算法的一个安全漏洞,特别是在密码破解等场景下可能被利用。

综上所述,MD5算法的安全性已经受到广泛质疑,并且不再适合用于安全敏感的应用程序。因此,建议使用更安全的哈希算法,如SHA-256、SHA-3等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1612409.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Axure引用ECharts图表 解决火狐浏览器出错

Axure原型添加Echarts图表,没耐心看文章的可以直接下载示例 Axure中使用ECharts图表示例 1. 打开Axure新建页面 2. 页面添加元件 元件类型随意,矩形、动态面板、热区、图片 甚至段落都可以3. 命名元件 随意命名,单个页面用到多个图表时名…

dspbuilder中使用signalcompiler时报错Error during compilation: Fitter failed,如何解决?

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&…

安装IntelliJ IDEA

文章目录 一、前言二、下载IDEA三、安装四、破解 一、前言 工欲善其事必先利其器,学习JAVA的第一步,首先是安装IDE,配置环境; 常用的JAVA IDE是IntelliJ IDEA和eclipse,我选择IntelliJ IDEA 二、下载IDEA 官网下载&…

游戏测试之常见控制技能(下)

备注:未经博主允许禁止转载 个人笔记(整理不易,有帮助,收藏点赞评论,爱你们!!!你的支持是我写作的动力) 笔记目录:学习笔记目录_pytest和unittest、airtest_w…

C++11 数据结构5 队列的概念,队列的顺序存储,实现,测试

一,队列的概念 队列是一种特殊的受限制的线性表。 队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。 队列是一种先进先出的t(First In First Out)的线性表,简称FIF…

数据库管理-第171期 Oracle是用这种方式确保读一致的(20240418)

数据库管理171期 2024-04-18 数据库管理-第171期 Oracle是用这种方式确保读一致的(20240418)1 基本概念2 用处3 注意事项总结 数据库管理-第171期 Oracle是用这种方式确保读一致的(20240418) 作者:胖头鱼的鱼缸&#x…

Redis系列之哨兵Sentinel集群搭建

在上一篇博客,我们已经知道怎么搭建一个redis主从复制集群,但是主从集群如果出现服务器宕机的情况,是不会自动选举master的,所以需要搭建更加高可用的集群模式,哨兵模式,哨兵集群会自动监控,如果…

深度学习发展中的继承和创新

深度学习是一步一步发展而来的,新的成就也是在原有的基础上,逐步取得突破,有一些东西是一点一点变化,突破发展而来的,也就是每一次小的突破和每一次小的突破累积起来,构成一个明显的进步。我们可以通过观察…

python 文件 成绩分析2

‘’’ 文件score.txt中存储了学生的考试信息,内容如下 小明,98,96 小刚,90,94 小红,90,94 小王,98,96 小刘,80,90 小赵,90,96 第二列是数学成绩,第三列是语文成绩 请写程序分析: 哪些同学语文成绩是相同的?哪些同学数学成绩是相同的?哪些同学语文和数…

C语言—字符指针,指针数组和数组指针详解

字符指针 在指针的类型中我们知道有一种指针类型为字符指针 char* ; int main() {char ch w;char *pc &ch;*pc w;return 0; }还有一种使用方式如下: int main() {const char* pstr "hello world.";//这里是把一个字符串放到pstr指针变量里了吗…

WebSocket 快速入门 - springboo聊天功能

目录 一、概述 1、HTTP(超文本传输协议) 2、轮询和长轮询 3、WebSocket 二、WebSocket快速使用 1、基于Java注解实现WebSocket服务器端 2、JS前端测试 三、WebSocket进阶使用 1、如何获取当前用户信息 2、 后端聊天功能实现 一、概述 HTTP…

Linux安装Docker完整教程及配置阿里云镜像源

官网文档地址 安装方法 1、查看服务器内核版本 Docker要求CentOS系统的内核版本高于3.10 uname -r #通过 uname -r 命令查看你当前的内核版本2、首先卸载已安装的Docker(如果有) 2.1 确保yum包更新到最新 yum update2.2 清除原有的docker&#xff0c…

生物特征识别的六大技术研究

生物特征识别技术是结合了计算机科学与光学、声学、生物传感器以及生物统计学原理,通过利用人体固有的生理特征(如指纹、人脸、虹膜、掌纹、指静脉等)和行为特征(如笔迹、声音、步态等),来进行个人身份的鉴…

layui--table里使用switch

1. 项目需求 在layui.table上面渲染后的列表上面加一个switch开关,监听switch开关的动作,实现本列数据的状态切换! 实现效果如下: 2. 实现方式 下面介绍的思路都是利用table的templet模板实现的,不同的在于模板代码…

F-logic DataCube3 SQL注入漏洞复现(CVE-2024-31750)

0x01 产品简介 F-logic DataCube3是一款用于光伏发电系统的紧凑型终端测量系统。 0x02 漏洞概述 F-logic DataCube3 /admin/pr_monitor/getting_index_data.php 接口处存在SQL注入漏洞,未经身份验证的攻击者可通过该漏洞获取数据库敏感信息,深入利用可控制整个web服务器。 …

JavaEE 初阶篇-深入了解 File 文件操作(实现文件搜索、非空文件夹删除)

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 File 文件概述 2.0 创建 File 类对象的方法 2.1 判断文件类型、获取文件信息的方法 2.2 创建文件、删除文件的方法 2.3 遍历文件夹的方法 3.0 文件搜索与删除 3.1…

虚拟机中的打印机,无法打印内容,打印的是白纸或英文和数字,打印不了中文

原因:打印机驱动设置不正确 解决方案: 打开打印机属性 -> 高级 -> 新驱动程序 下一页 -> Windows 更新 耐心等待,时间较长。 选择和打印机型号匹配的驱动,我选择的是: 虽然虚拟机和主机使用的驱动不…

《机器学习by周志华》学习笔记-线性模型-02

1、对数几率回归 1.1、背景 上一节我们考虑了线性模型的回归学习,但是想要做分类任务就需要用到上文中的广义线性模型。 当联系函数连续且充分光滑,考虑单调可微函数,令: 1.2、概念 找一个单调可谓函数,将分类任务的真实标记与线性回归模型的预测值联系起来,也叫做「…

关系型数据库的相关概念

表、记录、字段 表 一个实体集相当于一个表记录 一个实体相当于一个记录,在表中表表现为一行数据字段 一个字段相当于数据库表中的列 表的关联关系 一对一(一对一的表可以合并成一张表)一对多多对多 必须创建第三张表,该表通常称为联接表&#xff0c…

个人电脑信息安全注意事项

个人电脑信息安全注意事项 一、密码安全: 设置复杂且独特的密码,避免使用容易猜测或常见的密码。 定期更换密码,特别是在重要账户或应用上。 不要在多个账户上重复使用相同的密码。 使用密码管理工具来安全地存储和访问密码。 二、软件安…