├── .browserslistrc ├── public ├── favicon.ico └── index.html ├── vue.config.js ├── src ├── assets │ ├── logo.png │ └── logo.svg ├── plugins │ └── vuetify.js ├── main.js ├── fbConfig.js ├── processor.py └── App.vue ├── babel.config.js ├── .gitignore ├── .eslintrc.js ├── README.md ├── package.json └── scryptTool.html /.browserslistrc: -------------------------------------------------------------------------------- 1 | > 1% 2 | last 2 versions 3 | not dead 4 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidacm/bcrCardVerifier/master/public/favicon.ico -------------------------------------------------------------------------------- /vue.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | "transpileDependencies": [ 3 | "vuetify" 4 | ] 5 | } -------------------------------------------------------------------------------- /src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidacm/bcrCardVerifier/master/src/assets/logo.png -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | '@vue/cli-plugin-babel/preset' 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /src/plugins/vuetify.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import Vuetify from 'vuetify/lib'; 3 | 4 | Vue.use(Vuetify); 5 | 6 | export default new Vuetify({ 7 | }); 8 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import App from './App.vue' 3 | import vuetify from './plugins/vuetify'; 4 | 5 | 6 | Vue.config.productionTip = true 7 | 8 | new Vue({ 9 | vuetify, 10 | render: h => h(App) 11 | }).$mount('#app') 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | 5 | # local env files 6 | .env.local 7 | .env.*.local 8 | 9 | # Log files 10 | npm-debug.log* 11 | yarn-debug.log* 12 | yarn-error.log* 13 | pnpm-debug.log* 14 | 15 | # Editor directories and files 16 | .idea 17 | .vscode 18 | *.suo 19 | *.ntvs* 20 | *.njsproj 21 | *.sln 22 | *.sw? 23 | *.code-workspace -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { 4 | node: true 5 | }, 6 | 'extends': [ 7 | 'plugin:vue/essential', 8 | 'eslint:recommended' 9 | ], 10 | parserOptions: { 11 | parser: 'babel-eslint' 12 | }, 13 | rules: { 14 | 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', 15 | 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off' 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # bcrcards 2 | 3 | ## Project setup 4 | ``` 5 | npm install 6 | ``` 7 | 8 | ### Compiles and hot-reloads for development 9 | ``` 10 | npm run serve 11 | ``` 12 | 13 | ### Compiles and minifies for production 14 | ``` 15 | npm run build 16 | ``` 17 | 18 | ### Lints and fixes files 19 | ``` 20 | npm run lint 21 | ``` 22 | 23 | ### Customize configuration 24 | See [Configuration Reference](https://cli.vuejs.org/config/). 25 | -------------------------------------------------------------------------------- /src/assets/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/fbConfig.js: -------------------------------------------------------------------------------- 1 | import firebase from 'firebase/app'; 2 | import 'firebase/database'; // If using Firebase database 3 | var config = { 4 | apiKey: "AIzaSyAC35ubCOotpc9tA0vRshxfTEqMisjONHA", 5 | authDomain: "test2-511fa.firebaseapp.com", 6 | databaseURL: "https://test2-511fa.firebaseio.com", 7 | projectId: "test2-511fa", 8 | storageBucket: "test2-511fa.appspot.com", 9 | messagingSenderId: "731937336766", 10 | appId: "1:731937336766:web:8ef6034f39c316d85cddef" 11 | }; 12 | firebase.initializeApp(config); 13 | var db = firebase.database(); 14 | const hashesCollection = db.ref("hashes"); 15 | 16 | export { db, hashesCollection } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bcrcards", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "serve": "vue-cli-service serve", 7 | "build": "vue-cli-service build", 8 | "lint": "vue-cli-service lint", 9 | "deploy": "node ./node_modules/vue-gh-pages/index.js -b gh-pages" 10 | }, 11 | "dependencies": { 12 | "core-js": "^3.6.5", 13 | "firebase": "^7.14.6", 14 | "scrypt-js": "^3.0.1", 15 | "vue": "^2.6.11", 16 | "vuetify": "^2.2.11" 17 | }, 18 | "devDependencies": { 19 | "@vue/cli-plugin-babel": "~4.4.0", 20 | "@vue/cli-plugin-eslint": "~4.4.0", 21 | "@vue/cli-service": "~4.4.0", 22 | "babel-eslint": "^10.1.0", 23 | "eslint": "^6.7.2", 24 | "eslint-plugin-vue": "^6.2.2", 25 | "sass": "^1.19.0", 26 | "sass-loader": "^8.0.0", 27 | "vue-cli-plugin-vuetify": "~2.0.5", 28 | "vue-gh-pages": "^1.19.1", 29 | "vue-template-compiler": "^2.6.11", 30 | "vuetify-loader": "^1.3.0" 31 | }, 32 | "homepage": "https://github.com/davidacm/bcrCardVerifier" 33 | } 34 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | 6 | 7 | 8 |El objetivo de esta página es que las personas puedan verificar si sus tarjetas se encuentran en el listado de tarjetas filtradas del BCR, de forma fácil, fiable y segura.
8 |Aunque existen otros sitios que ofrecen este servicio, generan muchos falsos positivos debido a que no se comprueba el número completo de una tarjeta. Una de mis tarjetas que no fue filtrada, generó más de 50 coincidencias.
10 |He ideado un método para poder verificar si un número de tarjeta se encuentra en el listado de tarjetas filtradas, sin necesidad que un número de tarjeta deba ser enviado al servidor que contiene la base de datos.
12 |Aunque el banco de Costa Rica asegura que la información de las tarjetas no ha sido filtrada y si lo fue los datos ya no son relevantes, el hecho de que sus sistemas hayan sido hackeados refleja deficiencias en el sistema general.
14 |Aunque quisiera creer en el mensaje de tranquilidad que el BCR nos envía, me resulta difícil debido a los múltiples problemas que he tenido al usar su sistema mediante la página web. Lo cual me hace pensar que sí existen deficiencias que podrían ser aprovechadas por hackers.
16 |Brindar datos personales o de sus tarjetas es algo que nunca debería hacer. Por eso en vez de solicitar el número, se solicita una clave que se genera a partir de dicho número mediante un algoritmo llamado scrypt.
28 |No hay forma de revertir o determinar el dato inicial partiendo de la clave generada, scrypt es uno de los algoritmos más seguros a la hora de guardar por ejemplo una contraseña en una base de datos.
30 |Se ha calculado la clave para cada tarjeta en apariencia robada, y se han almacenado dichas claves en una base de datos. La clave que envíe será comparada contra todas las claves existentes. De manera que su número de tarjeta solo se requiere para generar la clave, y poderla comparar con el listado de claves disponibles en la base de datos.
32 |Para garantizar que ningún dato confidencial se está capturando, la aplicación se ha hecho en modalidad open source (código abierto) de manera que cualquier persona puede revisar el código fuente, incluso los historiales de cambio si los hubieran.
39 |Esta aplicación se encuentra en github en un repositorio de código abierto, la misma es servida por la misma plataforma de github. Este servicio de servir una página web solo se habilita para proyectos de código abierto. Por lo tanto el mismo código del repositorio en github, es el que se ejecuta en este sitio.
41 |Si no confía en cuales datos se envían al servidor, siempre puede generar e introducir la clave asociada a su tarjeta con otra herramienta.
43 |¡Claro! En el sitio se ha dispuesto de una herramienta para generar la clave con el algoritmo scrypt por facilidad, pero la clave puede ser generada en otra parte. Introduce el dato requerido en el campo "Clave derivada"
50 |52 | Para su facilidad se ha creado una herramienta que funciona offline, preconfigurada con los parámetros necesarios. 53 | accede en este link 57 |
58 | 59 |Si utilizará otra herramienta, esta es la información que necesita.
61 |Salt: "c8m.qp+xv3*rhfUz" (sin las comillas).
63 |Algoritmo: scrypt, N: 128, r: 8, p: 1.
65 |El resultado se debe convertir a base64 ya que así se encuentran almacenadas las claves en la base de datos.
67 |Lo ideal es que compare con cualquier cadena de texto origen, de manera que coincidan los resultados generados de la herramienta utilizada y este sitio.
68 |Esta base de datos se generó partiendo de dos archivos de transacciones, de aproximadamente 2gb cada uno. Se procesaron en total 12216470 transacciones. Se descartaron 2981 de ellas, y se encontró que existen 1260500 tarjetas distintas en el total de transacciones disponibles.
75 |Si sabe usar git y ha usado la plataforma github, todo aporte es bienvenido en este repositorio.
82 |En la pregunta "¿Puedo generar la clave por mis propios medios y consultarla en esta aplicación?"
88 |se le brinda una página que puede descargar y le permite generar la clave derivada sin internet en cualquier dispositivo que soporte javascript. Pero si aún así lo encuentra complicado y confía en este sitio, al introducir el número de tarjeta en el cuadro de edición siguiente la clave será generada automáticamente para usted
La clave derivada es una forma de poder verificar su número de tarjeta sin que tenga que enviar su número en ningún momento. Si quiere conocer como poder generar dicha clave, le recomiendo leer las preguntas frecuentes. Entiendo que puede ser complicado para usted, pero es la única forma segura de poder contrastar su tarjeta contra toda la información disponible sin que usted tenga que revelar su número de tarjeta. Disculpas por la falta de usabilidad, a veces la seguridad requiere hacer ciertos sacrificios.
{{checkedKey}}
118 |Resultado {{result?"positivo":"negativo"}}. La clave proporcionada {{result?"":"no"}} se encuentra en la base de datos
Dado que su tarjeta se encuentra en la lista, lo más recomendable es que solicite el remplazo de su tarjeta con su banco. De lo contrario se expone a diversas estafas
121 |