diff options
author | 2022-04-18 10:16:59 +0200 | |
---|---|---|
committer | 2022-04-18 10:17:39 +0200 | |
commit | 6d5856fa93d1ffbf71856c75adc24ad87dc4b49b (patch) | |
tree | 4c2ab731cb0a6a44cc10c28ea97f42994bf8d4c4 | |
parent | 2b89111cbbfd49604cd135fbba097d5d40da3182 (diff) | |
download | it-tools-6d5856fa93d1ffbf71856c75adc24ad87dc4b49b.tar.gz it-tools-6d5856fa93d1ffbf71856c75adc24ad87dc4b49b.tar.zst it-tools-6d5856fa93d1ffbf71856c75adc24ad87dc4b49b.zip |
feat(new-tool): bcrypt
-rw-r--r-- | package-lock.json | 24 | ||||
-rw-r--r-- | package.json | 2 | ||||
-rw-r--r-- | src/tools/bcrypt/bcrypt.vue | 118 | ||||
-rw-r--r-- | src/tools/bcrypt/index.ts | 11 | ||||
-rw-r--r-- | src/tools/index.ts | 3 |
5 files changed, 157 insertions, 1 deletions
diff --git a/package-lock.json b/package-lock.json index 91587d9..d6cf454 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "@vicons/tabler": "^0.12.0", "@vueuse/core": "^8.2.1", "@vueuse/head": "^0.7.5", + "bcryptjs": "^2.4.3", "change-case": "^4.1.2", "colord": "^2.9.2", "cron-validator": "^1.3.1", @@ -31,6 +32,7 @@ }, "devDependencies": { "@rushstack/eslint-patch": "^1.1.0", + "@types/bcryptjs": "^2.4.2", "@types/crypto-js": "^4.1.1", "@types/jsdom": "^16.2.14", "@types/node": "^16.11.25", @@ -2112,6 +2114,12 @@ "node": ">=10.13.0" } }, + "node_modules/@types/bcryptjs": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.2.tgz", + "integrity": "sha512-LiMQ6EOPob/4yUL66SZzu6Yh77cbzJFYll+ZfaPiPPFswtIlA/Fs1MzdKYA7JApHU49zQTbJGX3PDmCpIdDBRQ==", + "dev": true + }, "node_modules/@types/chai": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.0.tgz", @@ -3173,6 +3181,11 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, + "node_modules/bcryptjs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", + "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=" + }, "node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -12690,6 +12703,12 @@ "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", "dev": true }, + "@types/bcryptjs": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.2.tgz", + "integrity": "sha512-LiMQ6EOPob/4yUL66SZzu6Yh77cbzJFYll+ZfaPiPPFswtIlA/Fs1MzdKYA7JApHU49zQTbJGX3PDmCpIdDBRQ==", + "dev": true + }, "@types/chai": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.0.tgz", @@ -13526,6 +13545,11 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, + "bcryptjs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", + "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=" + }, "bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", diff --git a/package.json b/package.json index 5478d91..13048be 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "@vicons/tabler": "^0.12.0", "@vueuse/core": "^8.2.1", "@vueuse/head": "^0.7.5", + "bcryptjs": "^2.4.3", "change-case": "^4.1.2", "colord": "^2.9.2", "cron-validator": "^1.3.1", @@ -36,6 +37,7 @@ }, "devDependencies": { "@rushstack/eslint-patch": "^1.1.0", + "@types/bcryptjs": "^2.4.2", "@types/crypto-js": "^4.1.1", "@types/jsdom": "^16.2.14", "@types/node": "^16.11.25", diff --git a/src/tools/bcrypt/bcrypt.vue b/src/tools/bcrypt/bcrypt.vue new file mode 100644 index 0000000..5d546dc --- /dev/null +++ b/src/tools/bcrypt/bcrypt.vue @@ -0,0 +1,118 @@ +<template> + <n-card title="Hash"> + <n-form label-width="120"> + <n-form-item + label="Your string: " + label-placement="left" + > + <n-input + v-model:value="input" + placeholder="Your string to bcrypt..." + autocomplete="off" + autocorrect="off" + autocapitalize="off" + spellcheck="false" + /> + </n-form-item> + <n-form-item + label="Salt count: " + label-placement="left" + > + <n-input-number + v-model:value="saltCount" + placeholder="Salt rounds..." + :max="10" + :min="0" + style="width: 100%;" + /> + </n-form-item> + <n-input + :value="hashed" + readonly + style="text-align: center;" + /> + </n-form> + <br> + <n-space justify="center"> + <n-button + secondary + @click="copy" + > + Copy hash + </n-button> + </n-space> + </n-card> + + <br> + <n-card title="Compare string with hash"> + <n-form label-width="120"> + <n-form-item + label="Your string: " + label-placement="left" + > + <n-input + v-model:value="compareString" + placeholder="Your string to compare..." + autocomplete="off" + autocorrect="off" + autocapitalize="off" + spellcheck="false" + /> + </n-form-item> + <n-form-item + label="Your hash: " + label-placement="left" + > + <n-input + v-model:value="compareHash" + placeholder="Your hahs to compare..." + autocomplete="off" + autocorrect="off" + autocapitalize="off" + spellcheck="false" + /> + </n-form-item> + <n-form-item + label="Do they match ? " + label-placement="left" + :show-feedback="false" + > + <div + class="compare-result" + :class="{positive:compareMatch}" + > + {{ compareMatch ? 'Yes' : 'No' }} + </div> + </n-form-item> + </n-form> + </n-card> +</template> + +<script setup lang="ts"> +import { computed, ref } from 'vue'; +import {hashSync, compareSync} from 'bcryptjs' +import { useCopy } from '@/composable/copy'; +import { useThemeVars } from 'naive-ui'; + +const themeVars = useThemeVars() + +const input = ref('') +const saltCount = ref(10) +const hashed = computed(() => hashSync(input.value, saltCount.value)) +const {copy} = useCopy({source: hashed, text:'Hashed string copied to the clipboard'}) + +const compareString = ref('') +const compareHash = ref('') +const compareMatch = computed(() => compareSync(compareString.value, compareHash.value)) + +</script> + +<style lang="less" scoped> +.compare-result { + color: v-bind('themeVars.errorColor'); + + &.positive { + color: v-bind('themeVars.successColor') + } +} +</style>
\ No newline at end of file diff --git a/src/tools/bcrypt/index.ts b/src/tools/bcrypt/index.ts new file mode 100644 index 0000000..9108853 --- /dev/null +++ b/src/tools/bcrypt/index.ts @@ -0,0 +1,11 @@ +import { LockSquare } from '@vicons/tabler'; +import type { ITool } from './../Tool'; + +export const tool: ITool = { + name: 'Bcrypt', + path: '/bcrypt', + description: 'Hash and compare text string using bcrypt. Bcrypt is a password-hashing function based on the Blowfish cipher.', + keywords: ['bcrypt', 'hash', 'compare', 'password', 'salt', 'round', 'storage', 'crypto'], + component: () => import('./bcrypt.vue'), + icon: LockSquare, +}; diff --git a/src/tools/index.ts b/src/tools/index.ts index 9ca90dd..bc29ac6 100644 --- a/src/tools/index.ts +++ b/src/tools/index.ts @@ -1,6 +1,7 @@ import { LockOpen } from '@vicons/tabler'; import type { ToolCategory } from './Tool'; +import { tool as bcrypt } from './bcrypt'; import { tool as caseConverter } from './case-converter'; import { tool as colorConverter } from './color-converter'; import { tool as qrCodeGenerator } from './qr-code-generator'; @@ -24,7 +25,7 @@ export const toolsByCategory: ToolCategory[] = [ { name: 'Crypto', icon: LockOpen, - components: [tokenGenerator, hashText, uuidGenerator, cypher, bip39], + components: [tokenGenerator, hashText, bcrypt, uuidGenerator, cypher, bip39], }, { name: 'Converter', |