国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

如何正確區分并使用加密與認證技術?

安全 數據安全
在密碼學專家之中,“加密并不是認證”是一個簡單的共識。但很多不了解密碼學的開發者,并不知道這句話的意義。如果這個知識更廣為人知和深入理解,那么將會避免很多的設計錯誤。

在密碼學專家之中,“加密并不是認證”是一個簡單的共識。但很多不了解密碼學的開發者,并不知道這句話的意義。如果這個知識更廣為人知和深入理解,那么將會避免很多的設計錯誤。

這一概念本身并不困難,但在表面之下,還有更多豐富的細節和玄妙之處有待發現。本文就是講述開發者對于加密和認證二者的混淆與誤用,并附上了優秀的解決方案。

0x01 加密與認證之間有哪些區別?

加密是呈現信息,使其在沒有正確的密鑰情況下,變得難以卒讀的過程。在簡單的對稱加密中,同一個密鑰被用于加密和解密。在非對稱加密中,可以使用用戶的公鑰對信息加密,使得只有對應私鑰的擁有者才能讀取它。

認證是呈現信息,使其抗篡改(通常在某一非常低的概率之內,小于1除以已知宇宙中粒子的數量),同時也證明它起源于預期發送者的過程。

注意:當本文提及真實性時,是專門指的信息真實性,而不是身份真實性。這是一個PKI和密鑰管理問題,我們可能在未來的博客中詳細說明。

就CIA triad而言:加密提供機密性,認證提供完整性。

加密不提供完整性;被篡改的信息(通常)還能解密,但結果通常會是垃圾。單獨加密也不抑制惡意第三方發送加密信息。

認證不提供機密性;可以為明文信息提供抗篡改。

在程序員中,常見的錯誤是混淆這兩個概念。你能很容易找到這樣的一個庫或者框架:加密cookie數據,然后在僅僅解密它之后就無條件地信任與使用之。

0x02 加密

我們之前定義了加密,并且詳細說明了它是提供機密性,但不提供完整性和真實性的。你可以篡改加密信息,并將產生的垃圾給予接收者。而且你甚至可以利用這種垃圾產生機制,來繞過安全控制。

考慮在加密cookie的情況下,有如下代碼:

  1. function setUnsafeCookie($name, $cookieData, $key)  
  2. {  
  3.     $iv = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM);  
  4.     return setcookie(  
  5.         $name,   
  6.         base64_encode(  
  7.             $iv.  
  8.             mcrypt_encrypt(  
  9.                 MCRYPT_RIJNDAEL_128,  
  10.                 $key,  
  11.                 json_encode($cookieData),  
  12.                 MCRYPT_MODE_CBC,  
  13.                 $iv  
  14.             )  
  15.         )  
  16.     );  
  17. }  
  18. function getUnsafeCookie($name, $key)  
  19. {  
  20.     if (!isset($_COOKIE[$name])) {  
  21.         return null;  
  22.     }  
  23.     $decoded = base64_decode($_COOKIE[$name]);  
  24.     $iv = mb_substr($decoded, 0, 16, '8bit');  
  25.     $ciphertext = mb_substr($decoded, 16, null, '8bit');  
  26.    
  27.     $decrypted = rtrim(  
  28.         mcrypt_decrypt(  
  29.             MCRYPT_RIJNDAEL_128,  
  30.             $key,  
  31.             $ciphertext,  
  32.             MCRYPT_MODE_CBC,  
  33.             $iv  
  34.         ),  
  35.         "\0"  
  36.     );  
  37.    
  38.     return json_decode($decrypted, true);  

上面的代碼提供了在密碼段鏈接模塊的AES加密,如果你傳入32字節的字符串作為$key,你甚至可以聲稱,為你的cookie提供了256位的AES加密,然后人們可能被誤導相信它是安全的。

0x03 如何攻擊未經認證的加密

比方說,在登錄到這個應用程序之后,你會發現你收到一個會話cookie,看起來就像

kHv9PAlStPZaZJHIYXzyCnuAhWdRRK7H0cNVUCwzCZ4M8fxH79xIIIbznxmiOxGQ7td8LwTzHFgwBmbqWuB+sQ==

讓我們改變一個字節的第一塊(初始化向量),并反復發送我們的新的cookie,直到出現一些變化。應該采取共4096次HTTP請求,以嘗試變量IV所有可能的單字節變化。在上面的例子中,經過2405次請求后,我們得到一個看起來像這樣的字符串:

kHv9PAlStPZaZZHIYXzyCnuAhWdRRK7H0cNVUCwzCZ4M8fxH79xIIIbznxmiOxGQ7td8LwTzHFgwBmbqWuB+sQ==

相比之下,在base64編碼的cookie中只有一個字符不同(kHv9PAlStPZaZ J vs kHv9PAlStPZaZ Z):

- kHv9PAlStPZaZJHIYXzyCnuAhWdRRK7H0cNVUCwzCZ4M8fxH79xIIIbznxmiOxGQ7td8LwTzHFgwBmbqWuB+sQ==

+ kHv9PAlStPZaZZHIYXzyCnuAhWdRRK7H0cNVUCwzCZ4M8fxH79xIIIbznxmiOxGQ7td8LwTzHFgwBmbqWuB+sQ==

我們存儲在這個cookie里的原始數據,是看起來像這樣的數組:

  1. array(2) {  
  2.   ["admin"]=> 
  3.   int(0)  
  4.   ["user"]=> 
  5.   "aaaaaaaaaaaaa"  
  6.  } 

但在僅僅改變初始化向量的一個字節之后,我們就能夠改寫我們的閱讀信息:

  1. array(2) {  
  2.   ["admin"]=> 
  3.   int(1)  
  4.   ["user"]=> 
  5.   "aaaaaaaaaaaaa"  

根據底層應用程序的設置方法,你或許可以翻轉一位進而提升成為一名管理員。即使你的cookie是加密的。 如果你想再現我們的結果,我們的加密密鑰是十六進制下的:000102030405060708090a0b0c0d0e0f

#p#

0x04 認證

如上所述,認證旨在提供信息的完整性(我們指顯著抗篡改能力),而這證明它來自預期的源(真實性)。這樣做的典型方法是,為信息計算一個密鑰散列消息認證碼(HMAC的簡稱),并將信息與它連結。

  1. function hmac_sign($message, $key)  
  2. {  
  3.     return hash_hmac('sha256', $message, $key) . $message;  
  4. }  
  5. function hmac_verify($bundle, $key)  
  6. {  
  7.     $msgMAC = mb_substr($bundle, 0, 64, '8bit');  
  8.     $message = mb_substr($bundle, 64, null, '8bit');  
  9.     return hash_equals(  
  10.         hash_hmac('sha256', $message, $key),  
  11.         $msgMAC  
  12.     );  

重要的是,這里使用一個適當的哈希工具,如HMAC,而不僅僅是一個簡單的散列函數。

  1. function unsafe_hash_sign($message, $key)  
  2. {  
  3.     return md5($key.$message) . $message;  
  4. }  
  5. function unsafe_hash_verify($bundle, $key)  
  6. {  
  7.     $msgHash = mb_substr($bundle, 0, 64, '8bit');  
  8.     $message = mb_substr($bundle, 64, null, '8bit');  
  9.     return md5($key.$message) == $msgHash;  

我在這兩個函數名前面加了unsafe,是因為它們還是易受到一些缺點的危害:

Timing Attacks

Chosen Prefix Attacks on MD5 (PDF)

Non-strict equality operator bugs (largely specific to PHP)

現在,我們有點接近我們強大的對稱加密認證的目標。目前仍有幾個問題,如:

如果我們的原始信息以空字節結尾會發生什么?

有沒有一個比mcrypt擴展庫默認使用的更好的填充策略?

由于使用AES,有哪些通信方面是易受攻擊的?

幸運的是,這些問題在現有的加密函數庫中已有了解答。我們強烈推薦你使用現有的庫,而不是寫自己的加密功能。對于PHP開發人員來說,你應該使用defuse/php-encryption(或者libsodium)。

0x05 用Libsodium安全加密Cookies

  1. /*  
  2. // At some point, we run this command:  
  3. $key = Sodium::randombytes_buf(Sodium::CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES);  
  4. */  
  5.    
  6. /**  
  7.  * Store ciphertext in a cookie  
  8.  *   
  9.  * @param string $name - cookie name  
  10.  * @param mixed $cookieData - cookie data  
  11.  * @param string $key - crypto key  
  12.  */  
  13. function setSafeCookie($name, $cookieData, $key)  
  14. {  
  15.     $nonce = Sodium::randombytes_buf(Sodium::CRYPTO_SECRETBOX_NONCEBYTES);  
  16.    
  17.     return setcookie(  
  18.         $name,  
  19.         base64_encode(  
  20.             $nonce.  
  21.             Sodium::crypto_secretbox(  
  22.                 json_encode($cookieData),  
  23.                 $nonce,  
  24.                 $key  
  25.             )  
  26.         )  
  27.     );  
  28. }  
  29.    
  30. /**  
  31.  * Decrypt a cookie, expand to array  
  32.  *   
  33.  * @param string $name - cookie name  
  34.  * @param string $key - crypto key  
  35.  */  
  36. function getSafeCookie($name, $key)  
  37. {  
  38.     $hexSize = 2 * Sodium::Sodium::CRYPTO_SECRETBOX_NONCEBYTES;  
  39.     if (!isset($_COOKIE[$name])) {  
  40.         return array();  
  41.     }  
  42.    
  43.     $decoded = base64_decode($_COOKIE[$name]);  
  44.     $nonce = mb_substr($decoded, 0, $hexSize, '8bit');  
  45.     $ciphertext = mb_substr($decoded, $hexSize, null, '8bit');  
  46.    
  47.     $decrypted = Sodium::crypto_secretbox_open(  
  48.         $ciphertext,  
  49.         $nonce,  
  50.         $key  
  51.     );  
  52.     if (empty($decrypted)) {  
  53.         return array();  
  54.     }  
  55.    
  56.     return json_decode($decrypted, true);  

對于沒有libsodium庫的開發人員,我們的一個博客讀者,提供了一個安全cookie實現的例子,其使用了defuse/php-encryption(我們推薦的PHP庫)。

0x06 使用關聯數據的認證加密

在我們前面的示例中,我們集中精力于,同時使用加密和認證,使其作為必須小心使用的單獨組件,以避免加密的悲劇。具體而言,我們專注于密碼段鏈接模塊的AES加密。

然而,密碼學家已經開發出更新,更具有彈性的加密模型,其加密和認證信息在同一操作。這些模型被稱為AEAD模型(Authenticated Encryption with Associated Data)。關聯數據意味著,無論你的應用程序需要什么進行認證,都不加密。

AEAD模型通常用于有狀態的目的,如網絡通信中,其中一個隨機數可以很容易地管理。

AEAD兩個可靠的實現是AES-GCM和ChaCha20-Poly1305。

AES-GCM是Galois/Counter模式中的高級加密標準(又名Rijndael算法加密)。這種模式在OpenSSL的最新版本中加入,但它目前在PHP中還不被支持。

ChaCha20-Poly1305結合了ChaCha20流密碼與Poly1305消息認證碼。這種模式在libsodium PHP擴展可用。Sodium::crypto_aead_chacha20poly1305_encrypt() Sodium::crypto_aead_chacha20poly1305_decrypt()

總結一下,你該記住的

加密不是認證

加密提供機密性

認證提供完整性

將兩者混為一談你就得自擔風險

為了完成CIA triad,你需要單獨解決可用性。這通常不是一個加密問題。

更重要的是:在密碼學專家的監督下,使用具有韌性被證實記錄的庫,而不是自己在那里閉門造車,你會好得多。

原文:https://paragonie.com/blog/2015/05/using-encryption-and-authentication-correctly

責任編輯:藍雨淚 來源: 烏云知識庫
相關推薦

2010-02-24 10:24:10

Python線程

2010-08-25 13:13:04

2010-08-26 09:40:00

2010-06-07 09:03:33

MySQL大小寫

2019-03-13 22:40:15

機器學習假設算法

2017-08-30 17:47:35

MySql索引

2021-04-12 16:31:09

加密貨幣資金金融

2025-07-29 09:06:04

2013-01-07 11:38:54

VMware認證

2011-07-25 09:07:16

2010-07-01 15:02:29

SQL Server數

2024-12-16 17:00:00

并行并發Java

2015-05-13 13:13:34

2022-09-07 08:58:58

Node.js框架

2018-12-05 09:00:00

RedisRedis Strea數據庫

2023-01-13 11:27:13

戰略平臺Forrester

2017-05-02 09:02:14

2010-01-18 17:23:55

函數

2023-12-26 11:56:14

Go通道編程

2022-11-23 08:00:00

開發Regulator調試
點贊
收藏

51CTO技術棧公眾號

久久精品视频中文字幕| 91高清视频免费| 一色桃子一区二区| 欧美中文字幕在线播放| 久久99精品久久久久久青青日本| 黄色av网址在线播放| 在线视频国产三级| 在线观看av的网站| 精品久久国产一区| 久久中文在线| 国产真实精品久久二三区| 欧美高清在线视频| 精品在线小视频| 动漫3d精品一区二区三区| 青青在线视频免费| 波多野结衣在线观看| 精品国产鲁一鲁****| 国内自拍一区| 国产精品丝袜在线| 国产亚洲日本欧美韩国| 蜜桃传媒视频麻豆第一区免费观看| 欧美激情成人网| 成人免费网址| 成人动漫免费在线观看| 福利视频网站一区二区三区| 欧美丰满嫩嫩电影| 国产91精品网站| 日本在线观看不卡| 四虎国产精品永远| 久久精品福利| 国产精品系列在线| 久久精品视频导航| 免费看黄色a级片| 国产丝袜在线播放| 亚洲电影在线一区二区三区| 91在线视频官网| 最近2019年日本中文免费字幕| 国产精品日韩一区二区| 狠狠操夜夜操| 久久不见久久见中文字幕免费 | 国产成人精品综合在线观看| 91成人在线精品| 国产97色在线|日韩| www成人免费视频| 亚洲国产综合在线观看| 久久精品国产亚洲高清剧情介绍| 色婷婷综合久久久中文一区二区| 国产日本欧美一区二区三区在线| 欧美伦理视频在线观看| 99欧美精品| 国产精品久久毛片| 欧美激情二区三区| 国产男女爽爽爽| 欧美在线关看| 91女人视频在线观看| 欧美华人在线视频| 精品一卡二卡三卡| 国产一区二区区别| 国产精品久久久久久久浪潮网站| 欧美不卡视频一区发布| 青青在线视频观看| 少妇一区二区视频| 亚洲国产综合人成综合网站| 99视频国产精品免费观看| 欧美zzoo| 99国产精品自拍| 91精品国产乱码久久蜜臀| 久久综合九色99| 欧美精品hd| 国产午夜精品福利| 久久久噜久噜久久综合| 狠狠干夜夜操| 久久国产婷婷国产香蕉| 精品国产乱码久久久久久图片| 久艹视频在线免费观看| 自拍视频亚洲| www.久久久久| 成人黄网18免费观看的网站| 欧美艳星介绍134位艳星| 欧美日韩大陆在线| 鲁一鲁一鲁一鲁一澡| 国产精品久久久久久久久久辛辛| 樱花草国产18久久久久| 精品欧美日韩在线| 欧美一级大片在线视频| 欧美丝袜丝交足nylons图片| 亚洲美女搞黄| 国产一区二区三区探花| 91精品在线免费观看| 秋霞久久久久久一区二区| 日韩一级特黄| 亚洲一二三区在线观看| 亚洲一区二区三区午夜| 久久激情电影| 欧美成人精品不卡视频在线观看| 日p在线观看| 亚洲精品乱码久久久久久久久 | 五月天欧美精品| 50度灰在线观看| 欧美日韩破处| 日日狠狠久久偷偷四色综合免费| 男人av在线| 久久精品国产色蜜蜜麻豆| 亚洲 日韩 国产第一| 成人美女视频| 欧美午夜影院一区| 黄网站app在线观看大全免费视频| 亚洲每日更新| 亚洲a在线观看| 日韩精品中文字幕第1页| 色婷婷av一区二区三区软件| 狠狠干婷婷色| 尤物视频一区二区| 丝袜制服影音先锋| 中文字幕不卡在线观看| 成人xxxx视频| 国产精品99久久久久久大便| 欧美精美视频| 97视频在线观看免费| 精品一区二区三区中文字幕视频| 日韩经典一区二区三区| 日本三级在线观看网站| 亚洲欧洲99久久| 成年人在线观看视频免费| 成人激情黄色小说| 黄色录像特级片| 亚洲激情影院| 色播亚洲婷婷| 久久精品国内一区二区三区| 欧美人xxxxx| 99精品福利视频| 国产精品视频免费在线观看| 免费看成人人体视频| 国产婷婷97碰碰久久人人蜜臀| 国产69精品久久久久孕妇| 亚洲在线一区二区三区| 亚洲女人天堂| 中文字幕国产精品一区二区| 亚洲一区在线直播| 国产aⅴ综合色| 国产日韩av网站| 国产一区二区在线观看免费| 国产欧美综合一区| 久久先锋资源网| 国产女王在线**视频| 欧美日本一区二区三区| 九色在线免费| 欧美日韩激情在线| 免费a级在线播放| 欧美日韩视频专区在线播放| 男人的天堂在线视频免费观看| 亚洲影视资源网| 91精品久久| 日韩精品日韩在线观看| 看黄网站在线| 精品一区电影国产| 日韩精品一级毛片在线播放| 亚州国产精品久久久| 91精品一区二区三区综合| 久久久水蜜桃| 国产三级欧美三级日产三级99 | 成人污污视频在线观看| jizz18欧美| 色综合久久中文字幕| 欧美中文字幕精在线不卡| 久久久久久久91| 日韩精品成人一区二区在线| 可以在线看的av网站| 色丁香久综合在线久综合在线观看| 久久米奇亚洲| 日韩经典中文字幕在线观看| 成人a'v在线播放| 日韩高清专区| 成人激情免费网站| 成人p站proumb入口| 精品国产一区二区精华| 涩涩涩视频在线观看| 高清亚洲成在人网站天堂| 狠狠做六月爱婷婷综合aⅴ| 成人永久免费| 亚洲精品欧美激情| www.久久久久.com| 欧美一级淫片videoshd| 欧美日本一区| 久久这里只精品| 精品国产乱码久久久久久1区2区| 日本午夜精品久久久久| 国产精品一区二区电影| 国产在线精品一区在线观看麻豆| 777视频在线观看| 久久精品视频导航| 蜜桃传媒麻豆第一区在线观看| 欧美r片在线| 欧美激情久久久久久| 国产精品99久久久久久久vr| 一不卡在线视频| 精品激情国产视频| 国产专区欧美精品| 嗯啊主人调教在线播放视频| 国产不卡av在线|