哈希(Hash)与加密(Encrypt)简述

两者区别

    1.Hash不可逆,且具有相同的长度; Encrypt可逆的,长度一般与明文长度成正比

    2.Hash是多对一的,即两个不同的明文有可能会生成同一个Hash,两者称为碰撞; Encrypt是一对一的

两者选择:

    如果数据仅仅是用来验证 则使用Hash,反之则使用Encrypt

两者使用:

    常用的Hash算法有MD5和SHA1,我们知道Hash算法是存在碰撞这种情况的,所以要通过Hash算法的验证 除了可以用原文之外 也可以通过原文的一个碰撞通过;另外也可以通过穷举法 不停的试错;所以在开发中,对于需要用于验证的数据,最好使用多重混合Hash,再或者使用salt

/**
 * 多重混合hash
 * md5:  hash('md5',  'xxxx');
 * sha1: hash('sha1', 'xxxx')
 */
$text = '123456';
$salt = 'abc';
//eg1
$hash = sha1(md5($text).md5($text));
//eg2
$hash = sha1(md5($text).md5($salt));
//以上需要将$hash,$salt都存入数据库

   常用的Encrypt算法有DES和AES,我们知道加密是可逆的,这就需要我们再加密后的密文中再次加入一些混淆,来增加破解的难度 下面用手册的例子作说明

//数据加密
$plaintext = "message to be encrypted";//原文
$cipher="AES-128-CBC";        //加密类型
$ivlen = openssl_cipher_iv_length($cipher);//根据加密类型获取向量长度
$iv = openssl_random_pseudo_bytes($ivlen);//根据向量长度生成随机向量数值
$ciphertext_raw = openssl_encrypt($plaintext, $cipher, $key, $options=OPENSSL_RAW_DATA, $iv);

//以上加密就算完成了  以下为增加加密后的混淆

//对密文进行二进制的hash
$hmac = hash_hmac('sha256', $ciphertext_raw, $key, $as_binary=true);
//将向量的值,密文的hash值,密文进行base64编码
$ciphertext = base64_encode( $iv.$hmac.$ciphertext_raw );
//至此一个完整的加密流程结束


//数据解密
$cipher="AES-128-CBC"
$c = base64_decode($ciphertext);//先base64解码
$ivlen = openssl_cipher_iv_length($cipher);//根据加密类型获取向量长度
$iv = substr($c, 0, $ivlen);//从密文中读取向量的值
$hmac = substr($c, $ivlen, $sha2len=32);//从密文中读取密文的hash值
$ciphertext_raw = substr($c, $ivlen+$sha2len);//获取真正的密文
$calcmac = hash_hmac('sha256', $ciphertext_raw, $key, $as_binary=true);//对密文hash
if (hash_equals($hmac, $calcmac))//判断当前密文hash与获取到的hash是否匹配
{//匹配则进行解密
    $original_plaintext = openssl_decrypt($ciphertext_raw, $cipher, $key, 
    $options=OPENSSL_RAW_DATA, $iv);//对密文进行解密
    echo $original_plaintext."\n";//输出原始密文
}

Hash比较

    $a = '0e123123123';
    $b = '0e789789789';
    if ($a == $b){
        echo '==:true';
        if(hash_equals($a,$b)){
            echo 'hash: true';
        } else {
            echo 'hash: false';
        }
    } else {
        echo '==:false';
    }
/*
    输出结果:
    // '==:true
    // 'hash: false'
*/

在php中 0eXXX 如果是0e开头的且后面均为数字的 会认为是0的XXX次幂 然后得出结果为0

所以我们需要使用 hash_equals ,当然也可以使用 全等于“===”

### 音频加密的方法和技术 音频加密涉及保护传输中的语音数据免受未经授权访问的技术。这些技术通常应用于实时通信(RTC)场景中,确保会话的安全性和隐私性[^1]。 #### 对称密钥加密 对称密钥加密使用相同的密钥来加密解密消息。这种方法简单高效,在许多情况下适用于音频流的处理。常见的算法有AES (Advanced Encryption Standard),它能够提供强大的安全保障并支持多种工作模式如CBC、CTR等。 ```python from Crypto.Cipher import AES import base64 def encrypt_audio(data, key): cipher = AES.new(key.encode(), AES.MODE_EAX) nonce = cipher.nonce ciphertext, tag = cipher.encrypt_and_digest(data) return { 'nonce': base64.b64encode(nonce).decode(), 'ciphertext': base64.b64encode(ciphertext).decode() } ``` #### 非对称密钥加密 非对称密钥加密采用一对公私钥来进行加解密操作。发送方利用接收者的公共密钥加密信息;只有持有相应私人密钥的人才能成功读取原始内容。RSA是一种广泛应用于此目的的经典方案。 ```python from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_OAEP import binascii def rsa_encrypt(public_key_str, plaintext): public_key = RSA.importKey(public_key_str) cipher_rsa = PKCS1_OAEP.new(public_key) encrypted_message = cipher_rsa.encrypt(plaintext) return binascii.hexlify(encrypted_message).decode('utf8') ``` #### 流密码编码方式 对于多媒体应用而言,流密码因其低延迟特性而备受青睐。这类机制允许逐位或逐字节地转换输入序列,从而实现快速且灵活的数据变换过程。例如ChaCha20就是一种高效的现代流式加密器。 ```python from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes from os import urandom def chacha20_encrypt(message_bytes, key=None): if not key: key = urandom(32) # Generate random 256-bit key iv = urandom(12) # Nonce must be unique per encryption operation. algorithm = algorithms.ChaCha20(key, iv) cipher = Cipher(algorithm, mode=None) encryptor = cipher.encryptor() ct = encryptor.update(message_bytes) + encryptor.finalize() return {'key': key, 'iv': iv, 'ct': ct} ``` 上述三种方法均可以用于不同场合下的音频文件或者实时通话过程中声音信号的安全防护措施之中。具体选择取决于实际需求以及性能考量等因素[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值