❶ 9 非對稱加密
目前為止,本書中只討論到對稱加密。假設一個密碼系統不只有一個密鑰,而是有一對密鑰,其中公鑰可以自由地發布,而私鑰由自己保管。其他人可以使用你的公鑰來加密數據,這個信息只有你的私鑰可以解密,這個被稱為 公鑰加密(public-key encryption)
很長一段時間,這都被認為是不可能的。然而從1970年開始,這一類型的演算法開始出現。第一個廣為流傳的是MIT的三位密碼學家:Ron Rivest,Adi Shamir 和Leonard Adleman提出的RSA。
公鑰演算法並不僅僅用來加密,實際上本書之前的部分已經提到過公鑰演算法而其不是直接用在加密上。有三個與公鑰演算法相關的主題
從表面來看,公鑰加密好像可以淘汰之前提到的對稱密鑰演算法。對於任何事情都可以使用公鑰加密,也不需要對稱密鑰系統中的密鑰交換過程。然而在實際的密碼學系統中,可以看到到處都是混合的加密,公鑰加密在其中起著重要作用,但是大部分的加解密以及認證工作還是基於對成密鑰演算法的。
目前來皮褲看最重要的原因是性能。與流密碼(原生的流密碼或者其他)演算法相比,公鑰加密機制實在是太慢了。RSA通常情況下需要2048位也就是256個位元組。其加密需要0.29百萬次循環,解密需要11.12百萬次循環。而對稱加密和解密只需要每位元組約10次循環。這也意味著在對稱密鑰演算法中,解密256位數據,只需要3000次循環,這個效率是非對稱版本的4000次。而目前塵握猛的密碼系統使得對稱加密更快了,在AES-GCM硬體加速或者Salsa20/ChaCha20隻需要2或者4次每位元組,更大程度上提高了性能。
實際的密碼系統中還有更多其他的問題。例如對於RSA來說,它不能加密任何比它大的信息,通常情況是小於或者等於4096位,比大部分的需求要小的多。當然最重要的問題依然是上述的速度的問題。
本節簡單描述RSA背後的數學問題。其本身並不能產生安全加密機制。之後會看到在其上構造的密碼指導OAEP。
為了產生一個key,需要挑選兩個大素數p和q,這些數需要隨機私密的挑選。將兩者相乘的到N,這個是公開的。然後選擇一個加密指數e,這個也是公開的。通常這個數是3或者65537.因為這些數的二進制形式中僅有很少量的1。計算指數會更有效。(N,e)是公鑰,任何人都可以用公鑰來加密消息M,得到密文C。
接下來的問題是解密,有一個解密指數d,可以將C轉化會M。如果指導p和q,d很容易計算。可以使用d來解密消息:
RSA的安全性依賴於對於不知道d的人來說解密操作是不可能的,並且在只知道(N,e)的情況下d的計算是非常難的。
類似於很多密碼系統,RSA依賴於特定數學問題的難度。給定密文C,和公鑰(N,e),反推出明文M。這被稱為RSA難題。
最直接的方法是將N分解為p*q。給定p和q,攻擊者只需要重復密鑰擁有者的過程來計算產生d即可。
幸運的是,沒有一個演算法可以在合理的時間內分解這么大的數。不幸的是,目前也無法證明該演算法一定不存在。更加糟糕的是,有一個理論上的演算法,被稱為Shor's Algorithm,可以在量子計算機上在合理的時間內分解一個數。目前,量子計算機還離我們有些遠,但是未來某天可能就會成為現實。到時候RSA就變得不再有效。
本節中僅僅提到了分解大數這個最直接的方式來攻擊RSA。在接下來的部分可以看到一系列針對RSA的實際攻擊,其主要依賴於一些具體的實現。
目前,沒有已知的實際的攻破RSA的方法。但這不意味著使用RSA的系統沒有被攻破過。和其他被攻破的系統一樣,應用中有很多組成部分,一旦其中的某部分沒有恰當的使用,就會使整個系統變得不可用。更多有關RSA實施的細節的,參考【Bon99】和【AV96】,本部分只提及一些有趣的部分。
Salt是一個用python寫的供應系統。它有一個模塊叫做 cypto ,它沒有使用已有的密碼學系統,而是實現了一個自己的,其中使用的RSA和AES由第三方庫提供。
很長一段時間里,Salt使派橋用的公鑰指數e是1,這也就意味著P e=P 1=P(mod N)。這也就意味著結果的密文就是明文。目前該問題已經被修復,這里只是為了提醒大家,不要實現自己的加密系統。Salt現在支持了SSH作為傳輸蹭,但是先前提到的DIY的RSA/AES系統依然存在,並且還是默認的傳輸層。
OAEP是Optimal asymmetric encryption padding的簡稱,是RSA填充的一種。它的結構類似於下圖(文檔中這個圖有問題,下面是正確的圖):
最終產生的需要被加密的數據是X||Y,是n位長,這個n是N的位數。它使用一個隨機的塊R它的長度是k,在這個標准中,k是一個定值。消息首先需要用0填充被擴充到n-k位。圖中左邊的長度為n-k位,右邊的長度為k。隨機塊R和以0擴充的M,M||000...使用兩個陷阱函數,G和H。陷阱函數都是從一個方向計算非常簡單,但是逆轉非常的難。世紀中通常為hash函數。
G的輸入是k位,輸出是n-k位,H的輸入是n-k位,輸出是k位。
然後結果的X和Y被連接在一起,然後由標準的RSA來進行加密產生密文。
解密的時候,要反過來操作。接收者收到X||Y,他們是指導k的,因為這個是協議里的定值。所以前n-k是X,後k位是Y。
想要得到M,M||000...,需要去計算
可以看出,對於一些H和G來說,需要所有的X和Y才能找到M。對於H和G有很多種基於Hash函數的選擇。
絕大多數的公鑰加密只能一次加密一小塊,一般都遠小於要發送的信息。另外這些演算法還很慢,比對稱加密要慢的多。通常非對稱加密用來連接密碼系統。
有了公鑰密碼和密鑰交換,是密碼學裡面兩個非常重要的部分,因為人們總是需要與其他人交換私密的信息。有了這兩個技術就可以安全地和其他人交流。
目前為止討論的加密都沒有任何形式的身份認證。這也就意味著對消息進行加密和解密,並不能驗證得到的消息確實是發送者發送的原本的消息。
沒有身份認證的加密可以提供隱私性,但是如之前章節所言,沒有身份認證,盡管攻擊者不知道任何原文的信息,他任然可以修改加密的信息。接收這些消息會泄漏一些私密的信息,這也就意味著私密性不在。例如之前第7章提到的CBC的填充攻擊。
綜上所言,出了加密私密的信息之外,還需要對其進行身份認證。通常身份認證都是對消息增加一些額外的可計算的信息。類似於加密,身份認證也分為對稱類型的和非對稱類型的。對稱類型的通常被稱為消息認證(message authentication),非對稱類型的通常被稱為數字簽名。
下一章先介紹一下另一個密碼學中的重點:hash函數。hash在產生簽名和消息認證等過程中都需要用到。
[Bon99] Dan Boneh. Twenty years of attacks on the RSA cryptosystem. Notices of the AMS , 46:203–213, 1999. URL: http://crypto.stanford.e/dabo/papers/RSA-survey.pdf .
[AV96] Ross Anderson and Serge Vaudenay. Minding your pʼs and qʼs. In In Advances in Cryptology - ASIACRYPT』96, LNCS 1163 , 26–35. Springer� Verlag, 1996. URL: http://www.cl.cam.ac.uk/~rja14/Papers/psandqs.pdf .
❷ 前端js 加密解密方式
一、base64加密
使用JS函數的window.btoa()和 window.atob(),分別是中臘編碼和解碼
二、編碼和解碼字元串
使用JS函巧羨數賣寬滑的escape()和unescape(),分別是編碼和解碼
三、AES加密解密
四、RSA加密解密
❸ 如何用js實現注冊密碼安全和登陸密碼安全
非對稱加密,比如RSA,公布出公鑰給js,讓js加密,再把加密數據傳遞給後台處理,私鑰解密
❹ 功能強大的JS加密庫-CryptoJS
CryptoJS是JavaScript的一個加解密庫集合,可以說平時開發磨肆中需要用到的加解密方法,它這里都包含了
1、MD5加密,這是一種不可逆的加密
2、SHA-1加密,是現有 SHA 哈希函數中最成熟的,它用於各種安全應用程序和協議
3、SHA-2加密,不像 SHA-1 那樣廣泛使用,盡管它似乎提供了更好的安全性
4、AES加解密瞎衫轎, 是美國聯邦信息處理標准 (FIPS)提出的高級加密標准
5、DES加解密, DES 是以前佔主導地位的加密演算法,並作為官方聯邦信息處理標准 (FIPS) 發布,由於密鑰大小較小,DES 現在被認塌孫為是不安全的
6、轉Base64
好了常用的加解密方法就介紹到這了
覺得效果不錯的請幫忙加個關注點個贊,經常分享前端實用開發技巧
❺ jsencrypt實現前端RSA非對稱加密解密(vue項目)
最近一個vue項目要求所有密碼數據需要使用RSA非對稱加密傳輸,以為挺簡單,結果開發過程中還是遇到了些問題,簡單做個筆記。同時也希望可以幫助到遇到同樣問題的道友門。
重點來了:使用jsencrypt實現RSA非對稱加解密
因為這里直接在前端加解密,所以需要一對現成的密鑰,我們通過 密鑰在線生成器 得到:
然後在需要使用的文件中引入JSEncrypt,我是將所有工具函數都封裝在一個js文件的,我就直接在該文件中引入,我看也有人是在main.js中引入的。
到這里我們的加密解密方法就完成了,在需要的地方直接拿過來用就好了!
大功告成!這樣就完了?我以為這樣就ok了。
當然,如果沒有遇到這個bug,就可以忽略下面的內容了。
從上面截圖可以看到,重啟項目的時候報錯: navigator is not defined
而且這個bug有點奇葩,先啟動項目再引入jsencrypt就什麼問題都沒有,但是先引入jsencrypt再啟動項目就報錯。這也是我前面能順利執行的原因所在。
通過好一通折騰,用了網上的各種方法,比如在main.js引入jsencrypt、引入jsdom之類的,都沒能解決這個問題,最終還是在jsencrypt的git相關 issue 下找到了這個問題的解決方案。
到這里問題就算基本解決了,但是由於項目組不止我一個前端,我不能要求每個同事或者以後接手維護項目的同事都要在node_moles中去替換文件。
所以就採用了另外一種方案:將jsencrypt.js通過在線js壓縮器壓縮至jsencrypt.min.js中,然後把jsencrypt.min.js放到src/assets/jsencrypt文件夾中,就不用npm install的方式了。
換了種方式,jsencrypt的引用方式需要做出相應的調整:
參考鏈接: RSA非對稱加密傳輸---前端加密&解密(VUE項目)
https://github.com/travist/jsencrypt/issues/144
PS:才疏學淺,如果有考慮不周之處或者有更好的解決方案,歡迎指正探討!
❻ 使用jsencrypt.js進行RSA加密
一個基於RSA加解密的js庫
使用公鑰結合 jsencrypt 提供的 encrypt 方法(需要加密的內容)進行加密
使用私鑰結合 jsencrypt 提供的 decrypt 方法進行解密
❼ 記錄一下前端使用CryptoJS的幾種加密方式
自己太小白了,之前在PC端項目中使用的MD5加密,現在的小程序項目使用了 CryptoJS 裡面的 enc-base64 和 hmac-sha1 ,之前沒有用到過這兩種,所以比較疑惑,為何在小程序不繼續使用 MD5 呢?所以在這里記錄一下自己解疑惑的一些知識點。
隨著互聯網的興起,我們對信息的安全越來越受重視,這樣就導致在web開發中,對用戶密碼等各種加密變得更加重要了。與伺服器的交互中,為了確保數據傳輸的安全性,避免被黑客抓包篡改。
對於Base64編碼的,我覺得看一篇文章能夠解決你的疑惑,我在這里就不贅述了
🧐 Base64編碼原理
如: 用戶密碼,請求參數,文件加密
如: 介面參數簽名驗證服務
支付數據、CA數字證書
前端的朋友可能會關注前端js加密,我們在做 WEB 的登錄功能時一般是通過 Form 提交或 Ajax 方式提交到伺服器進行驗證的。為了防止抓包,登錄密碼肯定要先進行一次加密(RSA),再提交到伺服器進行驗證。一些大公司都在使用,比如淘寶、京東、新浪 等。
前端加密也有很多現成的js庫,如:
JS-RSA: 用於執行OpenSSL RSA加密、解密和密鑰生成的Javascript庫, https://github.com/travist/jsencrypt
MD5: 單向散列加密md5 js庫, https://github.com/blueimp/JavaScript-MD5
crypto-js: 對稱加密AES js庫, https://github.com/brix/crypto-js
-CryptoJS (crypto.js) 為 JavaScript 提供了各種各樣的加密演算法。
HMAC 系列是消息驗證,用於驗證一個消息是否被篡改——如網站上傳遞 email 和 hmac(email),則接收時可以通過 hmac(email) 獲知 email 是否是用戶偽造的
❽ js有幾種加密方式
首先,MD5不是加密演算法,是簽名演算法,哎,到底是有多少國人被毒害了呀。
另外,只要是可以由軟體實現的加密演算法,js都能使用,只是有效率問題,
一般的
非對稱演算法,使用的資源都很龐大,所以js很少有。
而對稱的加密演算法……,由於js是對用戶可見的,所以……就和沒加密一樣。
這也就是為什麼真正的高安全網站都不會選擇用js做加密,而是選擇用https 協議這樣的手段。
再次重申,MD5不是加密演算法,所以不再上述范圍內
❾ 關於nodejs 怎麼實現 crypto des加密
就是加密和解密使用同一個密鑰,通常稱之為「Session Key 」這種加密技術在當今被廣泛採用,如美國政府所採用的DES加密標准就是一種典型的「對稱式」加密法,它的Session Key長度為56bits。
非對稱式加密:
就是加密和解密所使用的不是同一個密鑰,通常有兩個密鑰,稱為「公鑰」和「私鑰」,它們兩個必需配對使用,否則不能打開加密文件。
加密為系統中經常使用的功能,node自帶強大的加密功能Crypto,下面通過簡單的例子進行練習。
1、加密模塊的引用:
var crypto=require('crypto');
var $=require('underscore');var DEFAULTS = {
encoding: {
input: 'utf8',
output: 'hex'
},
algorithms: ['bf', 'blowfish', 'aes-128-cbc']
};
默認加密演算法配置項:
輸入數據格式為utf8,輸出格式為hex,
演算法使用bf,blowfish,aes-128-abc三種加密演算法;
2、配置項初始化:
function MixCrypto(options) {
if (typeof options == 'string')
options = { key: options };
options = $.extend({}, DEFAULTS, options);
this.key = options.key;
this.inputEncoding = options.encoding.input;
this.outputEncoding = options.encoding.output;
this.algorithms = options.algorithms;
}
加密演算法可以進行配置,通過配置option進行不同加密演算法及編碼的使用。
3、加密方法代碼如下:
MixCrypto.prototype.encrypt = function (plaintext) {
return $.rece(this.algorithms, function (memo, a) {
var cipher = crypto.createCipher(a, this.key);
return cipher.update(memo, this.inputEncoding, this.outputEncoding)
+ cipher.final(this.outputEncoding)
}, plaintext, this);
};
使用crypto進行數據的加密處理。
4、解密方法代碼如下:
MixCrypto.prototype.decrypt = function (crypted) {
try {
return $.receRight(this.algorithms, function (memo, a) {
var decipher = crypto.createDecipher(a, this.key);
return decipher.update(memo, this.outputEncoding, this.inputEncoding)
+ decipher.final(this.inputEncoding);
}, crypted, this);
} catch (e) {
return;
}
};
❿ js中常見的數據加密與解密的方法
加密在我們前端的開發中也是經常遇見的。本文只把我們常用的加密方法進行總結。不去糾結加密的具體實現方式(密碼學,太龐大了)。
常見的加密演算法基本分為這幾類,
RSA加密:RSA加密演算法是一種非對稱加密演算法。在公開密鑰加密和電子商業中RSA被廣泛使用。(這才是正經的加密演算法)
非對稱加密演算法:非對稱加密演算法需要兩個密鑰:公開密鑰(publickey:簡稱公鑰)和私有密鑰(privatekey:簡稱私鑰)。公鑰與私鑰是一對,如果用公鑰對數據進行加密,只有用對應的私鑰才能解密。因為加密和解密使用的是兩個不同的密鑰,所以這種演算法叫作非對稱加密演算法。
DES全稱為Data Encryption Standard,即數據加密標准,是一種使用密鑰加密的塊演算法
DES演算法的入口參數有三個:Key、Data、Mode。其中Key為7個位元組共56位,是DES演算法的工作密鑰;Data為8個位元組64位,是要被加密或被解密的數據;Mode為DES的工作方式,有兩種:加密或解密。
AES這個標准用來替代原先的DES
DES/AES我們合並在一起介紹其用法和特點
Base64是一種用64個字元來表示任意二進制數據的方法。base64是一種編碼方式而不是加密演算法。只是看上去像是加密而已(嚇唬人)。