今天是特別的日子,我想把這篇存稿發(fā)出來。
一次缺席,次次缺席,便不再期待重逢。
也是時候,解開最后一個設(shè)計過的謎題。
學(xué)加密的同時,我恰好寫前端比較多,也有朋友找我測試他們前端頁面上的加密方案的安全性。當(dāng)時我就在想:
- 前端很適合展示浪漫的心思。前端是一個公開的信息渠道,單純的前端代碼具有較差的隱匿性,但是又具備極其良好的傳播性。
- 加密具備公開又神秘的屬性。學(xué)到公鑰加密的時候我覺得這種手法真的是優(yōu)美極了:縱使一切信息都能被所有人看到,但只有發(fā)送者和接受者知道對方想表達(dá)的是什么。
公開的前端,加密的方案,說做就做。
我想到的是隱藏一段話,思維逐漸發(fā)散到祝他生日快樂。我不希望文本本身平鋪直述地躺在代碼里,也不希望同行解密后對我欲蓋彌彰的加密嗤之以鼻,所以我希望隱藏的手法多少帶一點點巧思。
這是我大二的解決辦法:
try{let key=eval(CryptoJS.AES.decrypt("U2FsdGVkX1/sZGG8RDCO08aUuolRteDh0GJRsSIBI4mUGuX9Gd7aPaV9ruxiZ/gFCLStKO9n4P9Y1EH4RELsgQ==", 'trios').toString(CryptoJS.enc.Utf8));
eval(CryptoJS.AES.decrypt("U2FsdGVkX18903sbV5GwKO1wzwFnS9TRTACh25BIRdHGjFdkq2jd75+JYMyicx/7cgVcY4kwGLGqV6Yo0IaaWA==", key).toString(CryptoJS.enc.Utf8));}catch{;}
兩段密文,第一段自帶密鑰,其實沒啥破解難度;巧思是第二段,第二段以第一段的運算結(jié)果作為密鑰。
我把這個代碼嵌入到了我寫的腳本中:【MOOC】JS腳本|便于復(fù)制粘貼中國大學(xué)MOOC網(wǎng)站的測試題和選項。
第一段解出來是:"''+new Date().getMonth()+new Date().getDate();"
,代表當(dāng)前的日期。
只有當(dāng)日期符合我加密的日期時,第二段才會解密成功。
這樣就絲滑地做到了“特定時間(即生日)觸發(fā)”。
這個加密方案靈感來源于公鑰加密方案的設(shè)計理念。公鑰加密之所以能成功,就是因為其中存在一個難解的數(shù)學(xué)問題,即大整數(shù)分解。因此我就在想,在我的設(shè)計場景里,“難解的問題”可以是什么呢?我想到了一個點:少有人知道我喜歡的人是什么時候生日。
解密的結(jié)果你們自己去解吧,就不貼了。
這兩行代碼的好處如下:
對于我:
- 可以放到任意地方執(zhí)行。只要是JS代碼,引入了CryptoJS就可以執(zhí)行了。作為純前端代碼,它的隱匿性和傳播性都還不錯。即使換成其他語言,也就只是換個加密庫的事情,方法可以保持不變。
對于他:
- 足夠簡單,以致于他可以解密。一方面因為是前端,所以不管是驗證還是解密都不需要額外安裝環(huán)境,不像Python或者別的啥還得裝環(huán)境。另一方面我專門嵌入到了腳本中,如果他嘗試過安裝我的腳本、或者說看過我的博客、或者看過我發(fā)的相關(guān)的內(nèi)容,他只需要安裝腳本就可以引入CryptoJS庫,并在頁面上直接做測試了【畢竟我也知道引入CryptoJS庫對于一個行外人來說可能挺麻煩的】。
- 他來解密,比其他人更加容易。畢竟密鑰是他生日,換別人還得爆破一下密鑰,雖然密鑰空間才366,但是多少也是要爆破一下的。
- 他不解密,效果也還是一樣的。不管解密與否,反正這個代碼會在他生日那天彈出祝他生日快樂的信息。管它彈給誰了,總之它是彈出來了。我已經(jīng)教過他怎么運行腳本了,基于人類原始的好奇心,他在看了這篇文章后萬一某天突然想起,可能會在生日那天運行一下我的腳本,也不枉我的精心設(shè)計。
對于同行:
-
調(diào)用
CryptoJS
庫有一點小門檻。很多人對瀏覽器腳本只停留在使用的階段,而CryptoJS
庫并不是一個控制臺能直接運行的常用庫,需要引入,因此我的這兩行代碼直接扔控制臺會報錯,需要配合腳本管理插件或者自行想辦法引入相應(yīng)的庫; -
new Date().getMonth()
的結(jié)果比實際月份少1,比如如果今天是4月,那么返回的值就是3。即使有人試圖暴力破解,得出來了密鑰是多少,破解的人也很可能會因為不熟悉JS代碼而弄錯我究竟要幾月祝他生日快樂; -
AES的加密模式特別多。如果不調(diào)用
CryptoJS
庫,試圖使用在線解密,由于CryptoJS
庫默認(rèn)的AES加密模式是CBC,會自動將密鑰拓展為256位,直接使用在線解密去解第一段密鑰時,需要先拓展trios
這個密鑰,否則無法使用在線解密。并且還得查到它的特定的填充模式。 - 這兩行代碼是無害且無意義的。就算猜出密鑰了,知道他是什么時候生日了,也對我倆之外的人都沒有什么意義;而如果沒猜出來這兩行代碼的作用,它尋常時候也不會執(zhí)行。
- 就算別人完全解密成功了,我的字符串也只包含他的化名昵稱。因此除非與我們倆都相熟的朋友,其他人并不知道我在祝福誰,很大程度地保證了他的互聯(lián)網(wǎng)隱私性。
至此,就形成了:
你知道我一定會私聊祝福你開心。
卻不知道我還會向全世界祝福你。
而我向全世界公開的祝福,
僅當(dāng)你愿意了解我的時候,
才會發(fā)現(xiàn)。
這個矛盾又浪漫的閉環(huán)。
方案的確拙劣,不過確實是我當(dāng)初能想到的藏匿一段文本的、最契合我自己的方法了。
要的就是難度不至于大到解不開,但是又永遠(yuǎn)對他雙標(biāo)。
如果讓我現(xiàn)在去設(shè)計肯定是盡量想辦法做到近似一次一密了?!静穗u碎碎念】
實際上,我當(dāng)時發(fā)布在互聯(lián)網(wǎng)上的大部分加密加鎖的內(nèi)容,如果他去解鎖都會更加簡單。
不過幸運又不幸的是,他一個也沒發(fā)現(xiàn)。文章來源:http://www.zghlxwxcb.cn/news/detail-858880.html
不過,這個方案仍然算是我感覺的挺有趣的一個,
公開分享給大家,或許可以有幸被某個路過的寫手捉到靈感。文章來源地址http://www.zghlxwxcb.cn/news/detail-858880.html
到了這里,關(guān)于【代碼】JS|前端密碼,浪漫至死不渝,祝我生日快樂的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!