1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-12-23 09:52:26 +01:00

Add mechanism to randomize seed phrase filename (#7863)

The filename is seeded by a simple use of Math.random() pulling from an alphanumeric character bank, as opposed to a more cryptographically random solution. This provides a simple layer of difficulty for bad actors to seek out the recovery phrase file.
This commit is contained in:
ryanml 2020-01-21 17:22:55 -08:00 committed by Mark Stacey
parent b095dc0347
commit d8c685ba2e
46 changed files with 35 additions and 126 deletions

View File

@ -669,9 +669,6 @@
"metamaskDescription": { "metamaskDescription": {
"message": "ከ Ethereum እና ያልተማከለ መረብ ጋር እርስዎን ማገናኘት።" "message": "ከ Ethereum እና ያልተማከለ መረብ ጋር እርስዎን ማገናኘት።"
}, },
"metamaskSeedWords": {
"message": "MetaMask የዘር ቃላት"
},
"metamaskVersion": { "metamaskVersion": {
"message": "የ MetaMask ስሪት" "message": "የ MetaMask ስሪት"
}, },

View File

@ -665,9 +665,6 @@
"metamaskDescription": { "metamaskDescription": {
"message": "إيصالك بالإيثيريوم وبالشبكة اللامركزية." "message": "إيصالك بالإيثيريوم وبالشبكة اللامركزية."
}, },
"metamaskSeedWords": {
"message": "كلمات MetaMask البذرية"
},
"metamaskVersion": { "metamaskVersion": {
"message": "إصدار MetaMask " "message": "إصدار MetaMask "
}, },

View File

@ -668,9 +668,6 @@
"metamaskDescription": { "metamaskDescription": {
"message": "Свързва ви с Ethereum и децентрализираната мрежа." "message": "Свързва ви с Ethereum и децентрализираната мрежа."
}, },
"metamaskSeedWords": {
"message": "Думи зародиш на MetaMask"
},
"metamaskVersion": { "metamaskVersion": {
"message": "Версия на MetaMask" "message": "Версия на MetaMask"
}, },

View File

@ -672,9 +672,6 @@
"metamaskDescription": { "metamaskDescription": {
"message": "আপনার Ethereum এবং ছড়িয়ে ছিটিয়ে থাকা ওয়েবের সাথে সংযোগ করছে। " "message": "আপনার Ethereum এবং ছড়িয়ে ছিটিয়ে থাকা ওয়েবের সাথে সংযোগ করছে। "
}, },
"metamaskSeedWords": {
"message": "MetaMask সীড শব্দসমূহ"
},
"metamaskVersion": { "metamaskVersion": {
"message": "MetaMask সংস্করণ" "message": "MetaMask সংস্করণ"
}, },

View File

@ -656,9 +656,6 @@
"metamaskDescription": { "metamaskDescription": {
"message": "Conectant-te a Ethereum i la web descentralitzada." "message": "Conectant-te a Ethereum i la web descentralitzada."
}, },
"metamaskSeedWords": {
"message": "Frase de recuperació de MetaMask"
},
"metamaskVersion": { "metamaskVersion": {
"message": "Versió MetaMask" "message": "Versió MetaMask"
}, },

View File

@ -656,9 +656,6 @@
"metamaskDescription": { "metamaskDescription": {
"message": "Som forbinder dig til Ethereum og de decentraliserede internet." "message": "Som forbinder dig til Ethereum og de decentraliserede internet."
}, },
"metamaskSeedWords": {
"message": "MetaMask Seedord"
},
"missingYourTokens": { "missingYourTokens": {
"message": "Kan du ikke se dine tokens?" "message": "Kan du ikke se dine tokens?"
}, },

View File

@ -648,9 +648,6 @@
"metamaskDescription": { "metamaskDescription": {
"message": "MetaMask ist ein sicherer Identitätssafe für Ethereum." "message": "MetaMask ist ein sicherer Identitätssafe für Ethereum."
}, },
"metamaskSeedWords": {
"message": "MetaMask-Seed-Wörter"
},
"metamaskVersion": { "metamaskVersion": {
"message": "MetaMask-Version" "message": "MetaMask-Version"
}, },

View File

@ -669,9 +669,6 @@
"metamaskDescription": { "metamaskDescription": {
"message": "Σύνδεση με το Ethereum και τον Αποκεντρωμένο Ιστό." "message": "Σύνδεση με το Ethereum και τον Αποκεντρωμένο Ιστό."
}, },
"metamaskSeedWords": {
"message": "Λέξεις Φύτρου MetaMask"
},
"metamaskVersion": { "metamaskVersion": {
"message": "Έκδοση MetaMask " "message": "Έκδοση MetaMask "
}, },

View File

@ -812,9 +812,6 @@
"metamaskDescription": { "metamaskDescription": {
"message": "Connecting you to Ethereum and the Decentralized Web." "message": "Connecting you to Ethereum and the Decentralized Web."
}, },
"metamaskSeedWords": {
"message": "MetaMask Seed Words"
},
"metamaskVersion": { "metamaskVersion": {
"message": "MetaMask Version" "message": "MetaMask Version"
}, },

View File

@ -548,9 +548,6 @@
"metamaskDescription": { "metamaskDescription": {
"message": "MetaMask es una identidad segura en Ethereum" "message": "MetaMask es una identidad segura en Ethereum"
}, },
"metamaskSeedWords": {
"message": "Palabras semilla de MetaMask"
},
"metamaskVersion": { "metamaskVersion": {
"message": "Versión de MetaMask" "message": "Versión de MetaMask"
}, },

View File

@ -657,9 +657,6 @@
"metamaskDescription": { "metamaskDescription": {
"message": "Te estamos conectando a Ethereum y a la web descentralizada." "message": "Te estamos conectando a Ethereum y a la web descentralizada."
}, },
"metamaskSeedWords": {
"message": "Palabras de inicialización de MetaMask"
},
"metamaskVersion": { "metamaskVersion": {
"message": "Versión de MetaMask" "message": "Versión de MetaMask"
}, },

View File

@ -662,9 +662,6 @@
"metamaskDescription": { "metamaskDescription": {
"message": "Teid ühendatakse Ethereumi ja detsentraliseeritud võrguga." "message": "Teid ühendatakse Ethereumi ja detsentraliseeritud võrguga."
}, },
"metamaskSeedWords": {
"message": "MetaMaski seemnesõnad"
},
"metamaskVersion": { "metamaskVersion": {
"message": "MetaMaski versioon" "message": "MetaMaski versioon"
}, },

View File

@ -672,9 +672,6 @@
"metamaskDescription": { "metamaskDescription": {
"message": "در حال اتصال شما با ایترم و وب غیر متمرکز شده." "message": "در حال اتصال شما با ایترم و وب غیر متمرکز شده."
}, },
"metamaskSeedWords": {
"message": "کلمات بازیاب MetaMask"
},
"metamaskVersion": { "metamaskVersion": {
"message": "نسخه MetaMask" "message": "نسخه MetaMask"
}, },

View File

@ -669,9 +669,6 @@
"metamaskDescription": { "metamaskDescription": {
"message": "Sinua yhdistetään Ethereumiin ja hajautettuun verkkoon." "message": "Sinua yhdistetään Ethereumiin ja hajautettuun verkkoon."
}, },
"metamaskSeedWords": {
"message": "MetaMaskin siemensanat"
},
"metamaskVersion": { "metamaskVersion": {
"message": "MetaMask-versio" "message": "MetaMask-versio"
}, },

View File

@ -607,9 +607,6 @@
"metamaskDescription": { "metamaskDescription": {
"message": "Kinokonekta ka sa Ethereum at sa Decentralized Web." "message": "Kinokonekta ka sa Ethereum at sa Decentralized Web."
}, },
"metamaskSeedWords": {
"message": "Seed Words ng MetaMask"
},
"metamaskVersion": { "metamaskVersion": {
"message": "Bersyon ng MetaMask" "message": "Bersyon ng MetaMask"
}, },

View File

@ -651,9 +651,6 @@
"metamaskDescription": { "metamaskDescription": {
"message": "MetaMask est un coffre sécurisé pour votre identité sur Ethereum." "message": "MetaMask est un coffre sécurisé pour votre identité sur Ethereum."
}, },
"metamaskSeedWords": {
"message": "Mots Seed pour MetaMask"
},
"metamaskVersion": { "metamaskVersion": {
"message": "Version de MetaMask" "message": "Version de MetaMask"
}, },

View File

@ -669,9 +669,6 @@
"metamaskDescription": { "metamaskDescription": {
"message": "מחבר אותך לאתריום ולרשת המבוזרת." "message": "מחבר אותך לאתריום ולרשת המבוזרת."
}, },
"metamaskSeedWords": {
"message": "מילות גרעין (Seed) של MetaMask "
},
"metamaskVersion": { "metamaskVersion": {
"message": "גרסת MetaMask" "message": "גרסת MetaMask"
}, },

View File

@ -669,9 +669,6 @@
"metamaskDescription": { "metamaskDescription": {
"message": "आपको Ethereum और विकेंद्रीकृत वेब से कनेक्ट कर रहे हैं।" "message": "आपको Ethereum और विकेंद्रीकृत वेब से कनेक्ट कर रहे हैं।"
}, },
"metamaskSeedWords": {
"message": "मेटामास्क बीज शब्द"
},
"metamaskVersion": { "metamaskVersion": {
"message": "MetaMask का संस्करण" "message": "MetaMask का संस्करण"
}, },

View File

@ -665,9 +665,6 @@
"metamaskDescription": { "metamaskDescription": {
"message": "Povezujete se na Ethereum i decentralizirani internet." "message": "Povezujete se na Ethereum i decentralizirani internet."
}, },
"metamaskSeedWords": {
"message": "Početne riječi za MetaMask"
},
"metamaskVersion": { "metamaskVersion": {
"message": "Inačica usluge MetaMask" "message": "Inačica usluge MetaMask"
}, },

View File

@ -401,9 +401,6 @@
"metamaskDescription": { "metamaskDescription": {
"message": "MetaMask sekirize idantite pou Ethereum." "message": "MetaMask sekirize idantite pou Ethereum."
}, },
"metamaskSeedWords": {
"message": "MetaMask Seed Mo"
},
"metamaskVersion": { "metamaskVersion": {
"message": "MetaMask Vèsyon" "message": "MetaMask Vèsyon"
}, },

View File

@ -665,9 +665,6 @@
"metamaskDescription": { "metamaskDescription": {
"message": "Csatlakozás az Ethereumhoz és a decentralizált hálózathoz." "message": "Csatlakozás az Ethereumhoz és a decentralizált hálózathoz."
}, },
"metamaskSeedWords": {
"message": "MetaMask seed szavak"
},
"metamaskVersion": { "metamaskVersion": {
"message": "MetaMask verzió" "message": "MetaMask verzió"
}, },

View File

@ -650,9 +650,6 @@
"metamaskDescription": { "metamaskDescription": {
"message": "Menghubungkan Anda ke Ethereum dan Web Terdesentralisasi." "message": "Menghubungkan Anda ke Ethereum dan Web Terdesentralisasi."
}, },
"metamaskSeedWords": {
"message": "Kata Benih MetaMask"
},
"metamaskVersion": { "metamaskVersion": {
"message": "Versi MetaMask" "message": "Versi MetaMask"
}, },

View File

@ -642,9 +642,6 @@
"metamaskDescription": { "metamaskDescription": {
"message": "MetaMask è una cassaforte sicura per identità su Ethereum." "message": "MetaMask è una cassaforte sicura per identità su Ethereum."
}, },
"metamaskSeedWords": {
"message": "Parole Seed di MetaMask"
},
"metamaskVersion": { "metamaskVersion": {
"message": "versione di MetaMask" "message": "versione di MetaMask"
}, },

View File

@ -672,9 +672,6 @@
"metamaskDescription": { "metamaskDescription": {
"message": "ನಿಮ್ಮನ್ನು ಎಥೆರಿಯಮ್ ಮತ್ತು ವಿಕೇಂದ್ರೀಕೃತ ವೆಬ್‌ಗೆ ಸಂಪರ್ಕಿಸಲಾಗುತ್ತಿದೆ." "message": "ನಿಮ್ಮನ್ನು ಎಥೆರಿಯಮ್ ಮತ್ತು ವಿಕೇಂದ್ರೀಕೃತ ವೆಬ್‌ಗೆ ಸಂಪರ್ಕಿಸಲಾಗುತ್ತಿದೆ."
}, },
"metamaskSeedWords": {
"message": "MetaMask ಸೀಡ್ ಪದಗಳು"
},
"metamaskVersion": { "metamaskVersion": {
"message": "MetaMask ಆವೃತ್ತಿ" "message": "MetaMask ಆವೃತ್ತಿ"
}, },

View File

@ -666,9 +666,6 @@
"metamaskDescription": { "metamaskDescription": {
"message": "메타마스크는 이더리움을 위한 안전한 저장소입니다." "message": "메타마스크는 이더리움을 위한 안전한 저장소입니다."
}, },
"metamaskSeedWords": {
"message": "메타마스크 시드 단어"
},
"metamaskVersion": { "metamaskVersion": {
"message": "메타마스크 버전" "message": "메타마스크 버전"
}, },

View File

@ -672,9 +672,6 @@
"metamaskDescription": { "metamaskDescription": {
"message": "Prijungiame jus prie „Ethereum“ ir decentralizuotojo žiniatinklio." "message": "Prijungiame jus prie „Ethereum“ ir decentralizuotojo žiniatinklio."
}, },
"metamaskSeedWords": {
"message": "„MetaMask“ atkūrimo žodžiai"
},
"metamaskVersion": { "metamaskVersion": {
"message": "„MetaMask“ versija" "message": "„MetaMask“ versija"
}, },

View File

@ -668,9 +668,6 @@
"metamaskDescription": { "metamaskDescription": {
"message": "Veido savienojumu ar Ethereum un decentralizēto tīmekli." "message": "Veido savienojumu ar Ethereum un decentralizēto tīmekli."
}, },
"metamaskSeedWords": {
"message": "MetaMask atkopšanas vārdi"
},
"metamaskVersion": { "metamaskVersion": {
"message": "MetaMask versija" "message": "MetaMask versija"
}, },

View File

@ -643,9 +643,6 @@
"metamaskDescription": { "metamaskDescription": {
"message": "Menyambungkan anda kepada Ethereum dan Web Ternyahpusat." "message": "Menyambungkan anda kepada Ethereum dan Web Ternyahpusat."
}, },
"metamaskSeedWords": {
"message": "Perkataan Benih MetaMask"
},
"metamaskVersion": { "metamaskVersion": {
"message": "Versi MetaMask" "message": "Versi MetaMask"
}, },

View File

@ -662,9 +662,6 @@
"metamaskDescription": { "metamaskDescription": {
"message": "Kobler deg til Ethereum og det desentraliserte nettet." "message": "Kobler deg til Ethereum og det desentraliserte nettet."
}, },
"metamaskSeedWords": {
"message": "Mnemoniske gjenopprettingsfraser for MetaMask "
},
"metamaskVersion": { "metamaskVersion": {
"message": "MetaMask-versjon " "message": "MetaMask-versjon "
}, },

View File

@ -663,9 +663,6 @@
"metamaskDescription": { "metamaskDescription": {
"message": "MetaMask to bezpieczny portfel dla Ethereum." "message": "MetaMask to bezpieczny portfel dla Ethereum."
}, },
"metamaskSeedWords": {
"message": "Słowa Seed MetaMask"
},
"metamaskVersion": { "metamaskVersion": {
"message": "Wersja MetaMask" "message": "Wersja MetaMask"
}, },

View File

@ -657,9 +657,6 @@
"metamaskDescription": { "metamaskDescription": {
"message": "Conectando você ao Ethereum e à Web Descentralizada." "message": "Conectando você ao Ethereum e à Web Descentralizada."
}, },
"metamaskSeedWords": {
"message": "Palavras-semente do MetaMask"
},
"metamaskVersion": { "metamaskVersion": {
"message": "Versão do MetaMask" "message": "Versão do MetaMask"
}, },

View File

@ -659,9 +659,6 @@
"metamaskDescription": { "metamaskDescription": {
"message": "Vă conectăm la Ethereum și la Internetul descentralizat." "message": "Vă conectăm la Ethereum și la Internetul descentralizat."
}, },
"metamaskSeedWords": {
"message": "Cuvinte Seed MetaMask"
},
"metamaskVersion": { "metamaskVersion": {
"message": "Versiune MetaMask" "message": "Versiune MetaMask"
}, },

View File

@ -896,9 +896,6 @@
"menu": { "menu": {
"message": "Меню" "message": "Меню"
}, },
"metamaskSeedWords": {
"message": "MetaMask ключевая фраза (сид)"
},
"metamaskVersion": { "metamaskVersion": {
"message": "Версия MetaMask" "message": "Версия MetaMask"
}, },

View File

@ -638,9 +638,6 @@
"metamaskDescription": { "metamaskDescription": {
"message": "MetaMask je bezpečný osobní trezor pro Ethereum." "message": "MetaMask je bezpečný osobní trezor pro Ethereum."
}, },
"metamaskSeedWords": {
"message": "Seed slová MetaMask"
},
"metamaskVersion": { "metamaskVersion": {
"message": "Verzia MetaMask" "message": "Verzia MetaMask"
}, },

View File

@ -657,9 +657,6 @@
"metamaskDescription": { "metamaskDescription": {
"message": "MetaMask je varen identitetni sklad za Ethereum." "message": "MetaMask je varen identitetni sklad za Ethereum."
}, },
"metamaskSeedWords": {
"message": "Seed Words"
},
"metamaskVersion": { "metamaskVersion": {
"message": "Različica" "message": "Različica"
}, },

View File

@ -663,9 +663,6 @@
"metamaskDescription": { "metamaskDescription": {
"message": "Povezivanje na Ethereum i decentralizovani veb." "message": "Povezivanje na Ethereum i decentralizovani veb."
}, },
"metamaskSeedWords": {
"message": "MetaMask reči početne vrednosti"
},
"metamaskVersion": { "metamaskVersion": {
"message": "MetaMask verzija" "message": "MetaMask verzija"
}, },

View File

@ -656,9 +656,6 @@
"metamaskDescription": { "metamaskDescription": {
"message": "Ansluter dig mot Ethereum och den decentraliserade webben." "message": "Ansluter dig mot Ethereum och den decentraliserade webben."
}, },
"metamaskSeedWords": {
"message": "MetaMask"
},
"metamaskVersion": { "metamaskVersion": {
"message": "MetaMask-version" "message": "MetaMask-version"
}, },

View File

@ -650,9 +650,6 @@
"metamaskDescription": { "metamaskDescription": {
"message": "Kukuunganisha kwenye Ethereum na Wavutiu Uliotawanywa." "message": "Kukuunganisha kwenye Ethereum na Wavutiu Uliotawanywa."
}, },
"metamaskSeedWords": {
"message": "Maeno ya Kianzio ya MetaMask"
},
"metamaskVersion": { "metamaskVersion": {
"message": "Toleo la MetaMask" "message": "Toleo la MetaMask"
}, },

View File

@ -672,9 +672,6 @@
"metamaskDescription": { "metamaskDescription": {
"message": "Під'єднуємо вас до Ethereum та децентралізованої мережі." "message": "Під'єднуємо вас до Ethereum та децентралізованої мережі."
}, },
"metamaskSeedWords": {
"message": "Початкові слова MetaMask"
},
"metamaskVersion": { "metamaskVersion": {
"message": "Версія MetaMask" "message": "Версія MetaMask"
}, },

View File

@ -660,9 +660,6 @@
"metamaskDescription": { "metamaskDescription": {
"message": "MetaMask is a secure identity vault for Ethereum." "message": "MetaMask is a secure identity vault for Ethereum."
}, },
"metamaskSeedWords": {
"message": "MetaMask 助记词"
},
"metamaskVersion": { "metamaskVersion": {
"message": "MetaMask 版本" "message": "MetaMask 版本"
}, },

View File

@ -5,7 +5,7 @@ import { exportAsFile } from '../../../helpers/utils/util'
class ExportTextContainer extends Component { class ExportTextContainer extends Component {
render () { render () {
const { text = '', filename = '' } = this.props const { text = '' } = this.props
const { t } = this.context const { t } = this.context
return ( return (
@ -27,7 +27,7 @@ class ExportTextContainer extends Component {
</div> </div>
<div <div
className="export-text-container__button" className="export-text-container__button"
onClick={() => exportAsFile(filename, text)} onClick={() => exportAsFile('', text)}
> >
<img src="images/download.svg" alt="" /> <img src="images/download.svg" alt="" />
<div className="export-text-container__button-text"> <div className="export-text-container__button-text">
@ -42,7 +42,6 @@ class ExportTextContainer extends Component {
ExportTextContainer.propTypes = { ExportTextContainer.propTypes = {
text: PropTypes.string, text: PropTypes.string,
filename: PropTypes.string,
} }
ExportTextContainer.contextTypes = { ExportTextContainer.contextTypes = {

View File

@ -213,7 +213,22 @@ export function getContractAtAddress (tokenAddress) {
return global.eth.contract(abi).at(tokenAddress) return global.eth.contract(abi).at(tokenAddress)
} }
export function getRandomFileName () {
let fileName = ''
const charBank = [
...'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789',
]
const fileNameLength = Math.floor((Math.random() * 7) + 6)
for (let i = 0; i < fileNameLength; i++) {
fileName += charBank[Math.floor(Math.random() * charBank.length)]
}
return fileName
}
export function exportAsFile (filename, data, type = 'text/csv') { export function exportAsFile (filename, data, type = 'text/csv') {
filename = filename || getRandomFileName()
// source: https://stackoverflow.com/a/33542499 by Ludovic Feltz // source: https://stackoverflow.com/a/33542499 by Ludovic Feltz
const blob = new Blob([data], { type }) const blob = new Blob([data], { type })
if (window.navigator.msSaveOrOpenBlob) { if (window.navigator.msSaveOrOpenBlob) {

View File

@ -254,5 +254,20 @@ describe('util', function () {
assert(result) assert(result)
}) })
}) })
describe('#getRandomFileName', function () {
it('should only return a string containing alphanumeric characters', function () {
const result = util.getRandomFileName()
assert(result.match(/^[a-zA-Z0-9]*$/g))
})
// 50 samples
it('should return a string that is between 6 and 12 characters in length', function () {
for (let i = 0; i < 50; i++) {
const result = util.getRandomFileName()
assert(result.length >= 6 && result.length <= 12)
}
})
})
}) })
}) })

View File

@ -67,7 +67,7 @@ export default class ConfirmSeedPhrase extends PureComponent {
} }
handleExport = () => { handleExport = () => {
exportAsFile('MetaMask Secret Backup Phrase', this.props.seedPhrase, 'text/plain') exportAsFile('', this.props.seedPhrase, 'text/plain')
} }
handleSubmit = async () => { handleSubmit = async () => {

View File

@ -30,7 +30,7 @@ export default class RevealSeedPhrase extends PureComponent {
} }
handleExport = () => { handleExport = () => {
exportAsFile('MetaMask Secret Backup Phrase', this.props.seedPhrase, 'text/plain') exportAsFile('', this.props.seedPhrase, 'text/plain')
} }
handleNext = () => { handleNext = () => {

View File

@ -88,7 +88,7 @@ class RevealSeedPage extends Component {
return ( return (
<div> <div>
<label className="reveal-seed__label">{t('yourPrivateSeedPhrase')}</label> <label className="reveal-seed__label">{t('yourPrivateSeedPhrase')}</label>
<ExportTextContainer text={this.state.seedWords} filename={t('metamaskSeedWords')} /> <ExportTextContainer text={this.state.seedWords} />
</div> </div>
) )
} }