[{"data":1,"prerenderedAt":1209},["ShallowReactive",2],{"category-passprotect":3},[4,679],{"id":5,"title":6,"author":7,"body":8,"category":24,"categorySlug":645,"date":646,"description":14,"excerpt":647,"extension":667,"location":668,"meta":669,"navigation":222,"path":670,"published":222,"seo":671,"slug":672,"stem":673,"tags":674,"timeToRead":243,"__hash__":678},"posts\u002Fposts\u002FPassprotect\u002F2020-07-27-fin-passprotect.md","Fin de Passprotect","Ulrich Vandenhekke",{"type":9,"value":10,"toc":641},"minimark",[11,15,18,26,36,44,49,52,58,61,64,67,84,87,91,97,100,103,106,114,117,126,129,134,137,159,162,166,181,191,603,610,613,617,620,623,626,637],[12,13,14],"p",{},"Bonjour à tous,",[12,16,17],{},"Cela fait longtemps que je n'ai pas écrit de billet de blog (3 ans et demi). Et il s'en est passé des choses. Je travaille actuellement sur un nouveau projet dont je reviendrai vous parler plus tard.",[12,19,20,21,25],{},"A aujourd'hui je souhaiterais surtout vous parler de la fin de service de mon propre gestionnaire de mot de passe ",[22,23,24],"code",{},"Passprotect",".",[12,27,28,29,35],{},"Ces dernières années, j'ai utilisé mon propre gestionnaire de mot de passe: ",[30,31,24],"a",{"href":32,"rel":33},"https:\u002F\u002Fgogs.shadoware.org\u002Fphoenix\u002Fpassprotect-vue",[34],"nofollow"," développé par mes soins :).\nJe n'avais pas trouvé mon bonheur par ailleurs (OpenSource, Client WEB, ...) et avais décidé de développer le mien.",[12,37,38,39,25],{},"Puis j'ai découvert ",[30,40,43],{"href":41,"rel":42},"https:\u002F\u002Fbitwarden.com\u002F",[34],"Bitwarden",[45,46,48],"h1",{"id":47},"la-fin","La Fin",[12,50,51],{},"L'avantage d'utiliser un logiciel fabriqué par soi-même est la fierté de l'utiliser et de voir d'autres personnes l'utiliser également.",[12,53,54,55,57],{},"Malheureusement ",[22,56,24],{}," ne possédait que deux utilisateurs actifs (et quelques Bot\u002FSPAM) et ne proposait pas les fonctionnalités que d'autres proposaient. J'aurais pu les développer mais n'ayant pas assez d'utilisateurs, je n'avais pas assez de motivation pour le faire.",[12,59,60],{},"J'ai développé mon gestionnaire de mot de passe, à moi, car je ne me retrouvais pas dans les gestionnaires de mot de passe existants. Puis un jour, par hasard, j'ai découvert bitwarden.",[12,62,63],{},"J'ai alors décidé de le tester, (et cela fait maintenant presque un an), et étant satisfait, j'ai décidé d'arrêter de développer mon gestionnaire de mot de passe pour me concenter sur d'autres logiciels.",[12,65,66],{},"Même si le nom de domaine servant l'application n'existe plus, les sources resteront néanmoins disponibles ici, si cela intéresse quelqu'un :",[68,69,70,78],"ul",{},[71,72,73],"li",{},[30,74,77],{"href":75,"rel":76},"https:\u002F\u002Fgogs.shadoware.org\u002Fphoenix\u002Fpassprotect-server",[34],"Le serveur",[71,79,80],{},[30,81,83],{"href":32,"rel":82},[34],"Le client",[12,85,86],{},"Si quelqu'un trouve que le projet vaut toujours le coup, qu'il n'hésite pas à me contacter ou à proposer des évolutions, ou à développer des nouvelles fonctionnalités.",[45,88,90],{"id":89},"le-début","Le début",[12,92,93,94,25],{},"Parlons alors de ",[30,95,43],{"href":41,"rel":96},[34],[12,98,99],{},"D'un point de vue technique, c'est pas tout rose si on regarde la version officielle.",[12,101,102],{},"Ce qui est super, c'est qu'il existe un client pour Windows, Linux, MacOS, Android, Apple, les différents navigateurs et tout cela en OpenSource :).",[12,104,105],{},"Par contre la partie serveur (qui est également en OpenSource), nécessite :",[68,107,108,111],{},[71,109,110],{},".NET Core 3.1 SDK",[71,112,113],{},"SQL Serveur 2017",[12,115,116],{},"Et je n'apprécie pas forcément ces deux technos. (Et je n'ai surtout pas envie d'installer une base SQL Serveur uniquement pour un gestionnaire de mot de passe).",[12,118,119,120,125],{},"Par contre pour la partie Serveur, il existe une alternative non officielle en RUST (un fork, quoi): ",[30,121,124],{"href":122,"rel":123},"https:\u002F\u002Fgithub.com\u002Fdani-garcia\u002Fbitwarden_rs",[34],"bitwarden_rs",". Le serveur peut alors utiliser une base MySQL, Sqlite, PostgresQL.",[12,127,128],{},"Je décide alors de l'installer et l'utiliser pour me faire un avis.",[130,131,133],"h2",{"id":132},"quelles-sont-les-fonctionnalités-que-japprécie","Quelles sont les fonctionnalités que j'apprécie ?",[12,135,136],{},"Après quelques mois d'utilisation, voici ce que j'apprécie :",[68,138,139,142,145],{},[71,140,141],{},"Le partage de mot de passe entre compte",[71,143,144],{},"Les clients sous Android et dans les différents navigateurs.",[71,146,147,148],{},"Les rapports d'utilisation des mots de passes :\n",[68,149,150,153,156],{},[71,151,152],{},"réutilisés",[71,154,155],{},"exposés",[71,157,158],{},"faibles",[12,160,161],{},"Je n'y ai pas trouvé de point que je n'apprécie pas (à part que ce n'est pas développé par moi même 😄).",[130,163,165],{"id":164},"comment-linstaller","Comment l'installer ?",[12,167,168,169,172,173,176,177,180],{},"Il faudra que je vous parle de mon infra-structure et de comment j'héberge mes différents sites, mais en gros je me base entièrement sur ",[22,170,171],{},"Docker"," et ",[22,174,175],{},"Docker Swarm",". Du coup, l'hébergement de ",[22,178,179],{},"bitwarden"," également passe par là.",[12,182,183,184,187,188,190],{},"Voici mon fichier ",[22,185,186],{},"docker-compose.yml"," qui injecté à ",[22,189,175],{}," :",[192,193,198],"pre",{"className":194,"code":195,"language":196,"meta":197,"style":197},"language-yaml shiki shiki-themes one-dark-pro","version: \"3.4\"\n\nnetworks:\n  traefik-swarm:\n    external:\n      name: traefik-swarm\n  sendmail:\n    external:\n      name: sendmail\n\nservices:\n  bitwarden:\n    image: bitwardenrs\u002Fserver\n    volumes:\n      - \u002Fbitwarden\u002Fdata:\u002Fdata\n    environment:\n      - WEBSOCKET_ENABLED=true\n      - SIGNUPS_ALLOWED=false\n      - DOMAIN=https:\u002F\u002Fbitwrd.shadoware.org\n      - SMTP_HOST=postfix_relay\n      - SMTP_FROM=bitwrd@shadoware.org\n      - SMTP_PORT=25\n      - SMTP_SSL=false\n    networks:\n      - traefik-swarm\n      - sendmail\n    deploy:\n      labels:\n        - traefik.enable=true\n        - traefik.http.routers.bitwarden_server_router.rule=Host(`bitwrd.{{ domains_default }}`)\n        - traefik.http.routers.bitwarden_server_router.entrypoints=web\n        - traefik.http.routers.bitwarden_server_router.middlewares=redirecthttps@file,bitwarden_headers\n        - traefik.http.routers.bitwarden_server_router_https.rule=Host(`bitwrd.{{ domains_default }}`)\n        - traefik.http.routers.bitwarden_server_router_https.middlewares=bitwarden_headers\n        - traefik.http.routers.bitwarden_server_router_https.tls\n        - traefik.http.routers.bitwarden_server_router_https.tls.certresolver=shadoware\n        - traefik.http.routers.bitwarden_server_router_https.tls.domains[0].main={{ domains_default }}\n        - traefik.http.routers.bitwarden_server_router_https.tls.domains[0].sans=*.{{ domains_default }}\n        - traefik.http.services.bitwarden_server.loadbalancer.server.port=80\n        - traefik.http.middlewares.bitwarden_headers.headers.sslRedirect=true\n        - traefik.http.middlewares.bitwarden_headers.headers.browserXssFilter=true\n        - traefik.http.middlewares.bitwarden_headers.headers.contentTypeNosniff=true\n        - traefik.http.middlewares.bitwarden_headers.headers.sslHost=bitwrd.{{ domains_default }}\n        - traefik.http.middlewares.bitwarden_headers.headers.frameDeny=true\n      restart_policy:\n        condition: any\n      update_config:\n        order: start-first\n","yaml","",[22,199,200,217,224,233,241,249,260,268,275,285,290,298,306,317,325,334,342,350,358,366,374,382,390,398,406,413,420,428,436,445,453,461,469,477,485,493,501,509,517,525,533,541,549,557,565,573,584,592],{"__ignoreMap":197},[201,202,205,209,213],"span",{"class":203,"line":204},"line",1,[201,206,208],{"class":207},"sVyAn","version",[201,210,212],{"class":211},"sn6KH",": ",[201,214,216],{"class":215},"subq3","\"3.4\"\n",[201,218,220],{"class":203,"line":219},2,[201,221,223],{"emptyLinePlaceholder":222},true,"\n",[201,225,227,230],{"class":203,"line":226},3,[201,228,229],{"class":207},"networks",[201,231,232],{"class":211},":\n",[201,234,236,239],{"class":203,"line":235},4,[201,237,238],{"class":207},"  traefik-swarm",[201,240,232],{"class":211},[201,242,244,247],{"class":203,"line":243},5,[201,245,246],{"class":207},"    external",[201,248,232],{"class":211},[201,250,252,255,257],{"class":203,"line":251},6,[201,253,254],{"class":207},"      name",[201,256,212],{"class":211},[201,258,259],{"class":215},"traefik-swarm\n",[201,261,263,266],{"class":203,"line":262},7,[201,264,265],{"class":207},"  sendmail",[201,267,232],{"class":211},[201,269,271,273],{"class":203,"line":270},8,[201,272,246],{"class":207},[201,274,232],{"class":211},[201,276,278,280,282],{"class":203,"line":277},9,[201,279,254],{"class":207},[201,281,212],{"class":211},[201,283,284],{"class":215},"sendmail\n",[201,286,288],{"class":203,"line":287},10,[201,289,223],{"emptyLinePlaceholder":222},[201,291,293,296],{"class":203,"line":292},11,[201,294,295],{"class":207},"services",[201,297,232],{"class":211},[201,299,301,304],{"class":203,"line":300},12,[201,302,303],{"class":207},"  bitwarden",[201,305,232],{"class":211},[201,307,309,312,314],{"class":203,"line":308},13,[201,310,311],{"class":207},"    image",[201,313,212],{"class":211},[201,315,316],{"class":215},"bitwardenrs\u002Fserver\n",[201,318,320,323],{"class":203,"line":319},14,[201,321,322],{"class":207},"    volumes",[201,324,232],{"class":211},[201,326,328,331],{"class":203,"line":327},15,[201,329,330],{"class":211},"      - ",[201,332,333],{"class":215},"\u002Fbitwarden\u002Fdata:\u002Fdata\n",[201,335,337,340],{"class":203,"line":336},16,[201,338,339],{"class":207},"    environment",[201,341,232],{"class":211},[201,343,345,347],{"class":203,"line":344},17,[201,346,330],{"class":211},[201,348,349],{"class":215},"WEBSOCKET_ENABLED=true\n",[201,351,353,355],{"class":203,"line":352},18,[201,354,330],{"class":211},[201,356,357],{"class":215},"SIGNUPS_ALLOWED=false\n",[201,359,361,363],{"class":203,"line":360},19,[201,362,330],{"class":211},[201,364,365],{"class":215},"DOMAIN=https:\u002F\u002Fbitwrd.shadoware.org\n",[201,367,369,371],{"class":203,"line":368},20,[201,370,330],{"class":211},[201,372,373],{"class":215},"SMTP_HOST=postfix_relay\n",[201,375,377,379],{"class":203,"line":376},21,[201,378,330],{"class":211},[201,380,381],{"class":215},"SMTP_FROM=bitwrd@shadoware.org\n",[201,383,385,387],{"class":203,"line":384},22,[201,386,330],{"class":211},[201,388,389],{"class":215},"SMTP_PORT=25\n",[201,391,393,395],{"class":203,"line":392},23,[201,394,330],{"class":211},[201,396,397],{"class":215},"SMTP_SSL=false\n",[201,399,401,404],{"class":203,"line":400},24,[201,402,403],{"class":207},"    networks",[201,405,232],{"class":211},[201,407,409,411],{"class":203,"line":408},25,[201,410,330],{"class":211},[201,412,259],{"class":215},[201,414,416,418],{"class":203,"line":415},26,[201,417,330],{"class":211},[201,419,284],{"class":215},[201,421,423,426],{"class":203,"line":422},27,[201,424,425],{"class":207},"    deploy",[201,427,232],{"class":211},[201,429,431,434],{"class":203,"line":430},28,[201,432,433],{"class":207},"      labels",[201,435,232],{"class":211},[201,437,439,442],{"class":203,"line":438},29,[201,440,441],{"class":211},"        - ",[201,443,444],{"class":215},"traefik.enable=true\n",[201,446,448,450],{"class":203,"line":447},30,[201,449,441],{"class":211},[201,451,452],{"class":215},"traefik.http.routers.bitwarden_server_router.rule=Host(`bitwrd.{{ domains_default }}`)\n",[201,454,456,458],{"class":203,"line":455},31,[201,457,441],{"class":211},[201,459,460],{"class":215},"traefik.http.routers.bitwarden_server_router.entrypoints=web\n",[201,462,464,466],{"class":203,"line":463},32,[201,465,441],{"class":211},[201,467,468],{"class":215},"traefik.http.routers.bitwarden_server_router.middlewares=redirecthttps@file,bitwarden_headers\n",[201,470,472,474],{"class":203,"line":471},33,[201,473,441],{"class":211},[201,475,476],{"class":215},"traefik.http.routers.bitwarden_server_router_https.rule=Host(`bitwrd.{{ domains_default }}`)\n",[201,478,480,482],{"class":203,"line":479},34,[201,481,441],{"class":211},[201,483,484],{"class":215},"traefik.http.routers.bitwarden_server_router_https.middlewares=bitwarden_headers\n",[201,486,488,490],{"class":203,"line":487},35,[201,489,441],{"class":211},[201,491,492],{"class":215},"traefik.http.routers.bitwarden_server_router_https.tls\n",[201,494,496,498],{"class":203,"line":495},36,[201,497,441],{"class":211},[201,499,500],{"class":215},"traefik.http.routers.bitwarden_server_router_https.tls.certresolver=shadoware\n",[201,502,504,506],{"class":203,"line":503},37,[201,505,441],{"class":211},[201,507,508],{"class":215},"traefik.http.routers.bitwarden_server_router_https.tls.domains[0].main={{ domains_default }}\n",[201,510,512,514],{"class":203,"line":511},38,[201,513,441],{"class":211},[201,515,516],{"class":215},"traefik.http.routers.bitwarden_server_router_https.tls.domains[0].sans=*.{{ domains_default }}\n",[201,518,520,522],{"class":203,"line":519},39,[201,521,441],{"class":211},[201,523,524],{"class":215},"traefik.http.services.bitwarden_server.loadbalancer.server.port=80\n",[201,526,528,530],{"class":203,"line":527},40,[201,529,441],{"class":211},[201,531,532],{"class":215},"traefik.http.middlewares.bitwarden_headers.headers.sslRedirect=true\n",[201,534,536,538],{"class":203,"line":535},41,[201,537,441],{"class":211},[201,539,540],{"class":215},"traefik.http.middlewares.bitwarden_headers.headers.browserXssFilter=true\n",[201,542,544,546],{"class":203,"line":543},42,[201,545,441],{"class":211},[201,547,548],{"class":215},"traefik.http.middlewares.bitwarden_headers.headers.contentTypeNosniff=true\n",[201,550,552,554],{"class":203,"line":551},43,[201,553,441],{"class":211},[201,555,556],{"class":215},"traefik.http.middlewares.bitwarden_headers.headers.sslHost=bitwrd.{{ domains_default }}\n",[201,558,560,562],{"class":203,"line":559},44,[201,561,441],{"class":211},[201,563,564],{"class":215},"traefik.http.middlewares.bitwarden_headers.headers.frameDeny=true\n",[201,566,568,571],{"class":203,"line":567},45,[201,569,570],{"class":207},"      restart_policy",[201,572,232],{"class":211},[201,574,576,579,581],{"class":203,"line":575},46,[201,577,578],{"class":207},"        condition",[201,580,212],{"class":211},[201,582,583],{"class":215},"any\n",[201,585,587,590],{"class":203,"line":586},47,[201,588,589],{"class":207},"      update_config",[201,591,232],{"class":211},[201,593,595,598,600],{"class":203,"line":594},48,[201,596,597],{"class":207},"        order",[201,599,212],{"class":211},[201,601,602],{"class":215},"start-first\n",[12,604,605,606,609],{},"Comme vous pouvez le voir, j'utilise ",[22,607,608],{},"traefik"," pour router les noms de domaines vers les bonnes images.\nDans mon infrastructure j'essaye d'isoler au mieux chaque application et utilise ensuite les différents réseaux pour les faire communiquer.",[12,611,612],{},"Par exemple, cette application communique avec le réseau d'envoi de mail et aussi avec celui de traefik pour sortir sur Internet.",[45,614,616],{"id":615},"pour-finir","Pour finir",[12,618,619],{},"Ce que j'ai appris avec tout cela : j'ai apprécié faire mon propre gestionnaire de mot de passe. En développant ce dernier, j'ai appris quelques trucs sur comment bien gérer le chiffrage des mots de passes, de la bonne utilisation du sel, par exemple.",[12,621,622],{},"Ce que je savais déjà par contre, c'est qu'il est très difficile de concurrencer d'autres structures (comme Lastpass, BitWarden, ...) que beaucoup de monde utilise déjà.",[12,624,625],{},"Et je rappelle également que quelque soit la solution que vous choisissez pour stocker vos mots de passes, il est important :",[68,627,628,631,634],{},[71,629,630],{},"d'avoir un mot de passe différent par site internet, ainsi si un site se fait pirater, ce ne sont pas tous vos mots de passe qui sont à remplacer,",[71,632,633],{},"avoir un gestionnaire de mot de passe sécurisé est important, car si c'est ce dernier qui se fait véroler, vous devrez renouveller tous vos mots de passes,",[71,635,636],{},"utiliser un gestionnaire de mot de passe permet aussi de savoir tous les sites où on laisse une trace. En effet il est souvent très facile de créer un compte pour un site puis de ne jamais y retourner avant plusieurs années. Avoir une trace de ces sites peut permettre de les supprimer régulièrement et de savoir où on a laissé une trace numérique.",[638,639,640],"style",{},"html pre.shiki code .sVyAn, html code.shiki .sVyAn{--shiki-default:#E06C75}html pre.shiki code .sn6KH, html code.shiki .sn6KH{--shiki-default:#ABB2BF}html pre.shiki code .subq3, html code.shiki .subq3{--shiki-default:#98C379}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":197,"searchDepth":219,"depth":219,"links":642},[643,644],{"id":132,"depth":219,"text":133},{"id":164,"depth":219,"text":165},"passprotect","2020-07-27",{"type":9,"value":648},[649,651,653,657,662],[12,650,14],{},[12,652,17],{},[12,654,20,655,25],{},[22,656,24],{},[12,658,28,659,35],{},[30,660,24],{"href":32,"rel":661},[34],[12,663,38,664,25],{},[30,665,43],{"href":41,"rel":666},[34],"md","Lille, France",{"planet":222},"\u002Fpost\u002Ffin-passprotect",{"title":6,"description":14},"fin-passprotect","posts\u002FPassprotect\u002F2020-07-27-fin-passprotect",[645,675,676,677,179],"javascript","nodejs","password","aBn055QA5xKVE20jUEfM0UAavpQjMuzZ-j1dg5xODUg",{"id":680,"title":681,"author":7,"body":682,"category":24,"categorySlug":645,"date":1165,"description":14,"excerpt":1166,"extension":667,"location":668,"meta":1202,"navigation":222,"path":1203,"published":222,"seo":1204,"slug":1205,"stem":1206,"tags":1207,"timeToRead":235,"__hash__":1208},"posts\u002Fposts\u002FPassprotect\u002F2016-10-02-presentation-passprotect.md","Passprotect 1.0.0",{"type":9,"value":683,"toc":1156},[684,686,689,693,701,735,738,742,749,752,763,766,772,775,789,793,796,804,807,810,814,819,822,826,834,838,886,890,897,1122,1125,1139,1142,1146,1153],[12,685,14],{},[12,687,688],{},"Passprotect est un nouvel outil permettant d'enregistrer et de gérer vos mots de passe. L'idée derrière Passprotect est de pouvoir enregistrer et lire les mots de passe de vos\nsites Internet, de vos cartes de crédit, ou de toute autre forme de texte que vous voudriez garder en sécurité.",[45,690,692],{"id":691},"la-concurence","La concurence",[12,694,695,696,700],{},"La première question que l'on peut se poser est ",[697,698,699],"em",{},"Pourquoi ne pas avoir choisi une solution existante ?"," ? Alors passons en revue les différents outils que j'utilise actuellement\nou dont j'ai étudié la possibilité d'utiliser :",[68,702,703,711,719,727],{},[71,704,705,710],{},[30,706,709],{"href":707,"rel":708},"http:\u002F\u002Fwww.awallet.org\u002F",[34],"aWallet",": Un outil pour android que j'utilise actuellement (sans la partie synchro). Même si l'utilise jusqu'à présent régulièrement, le logiciel ne\nme convient pas. Il est propriétaire. Je n'ai pas confiance dans la synchro cloud. Je ne peux pas l'héberger moi même.",[71,712,713,718],{},[30,714,717],{"href":715,"rel":716},"https:\u002F\u002Flastpass.com",[34],"LastPass",": propriétaire, trop compliqué,",[71,720,721,726],{},[30,722,725],{"href":723,"rel":724},"http:\u002F\u002Fkeepass.info\u002F",[34],"KeePass",": Client lourd, je souhaitais un client léger avec potentiellement un futur client lourd sur android, et une extension chrome.",[71,728,729,734],{},[30,730,733],{"href":731,"rel":732},"https:\u002F\u002Fspideroak.com\u002Fsolutions\u002Fencryptr",[34],"Encryptr",": Libre :) Belle interface :) Mais basée sur un serveur crypton distant. J'aurais bien sûr pu forker le projet et le faire\npointer sur un de mes serveurs, installé manuellement, mais non.",[12,736,737],{},"Une autre raison de vouloir faire ma version, est tout simplement pour m'amuser 😄.",[45,739,741],{"id":740},"linterface","L'interface",[12,743,744,745,25],{},"Passprotect est un logiciel que vous pouvez installer sur votre propre serveur ou utiliser la version en ligne se trouvant à l'adresse\n",[30,746,747],{"href":747,"rel":748},"https:\u002F\u002Fpassprotect.shadoware.org",[34],[12,750,751],{},"Pour commencer nous avons la page de login qui vous permet de vous connecter, et si bien sûr vous n'avez pas de login, vous pouvez en enregistrer un. C'est à ce moment là que\nl'application va générer la clé et le sel utilisé pour protéger toutes vos données.",[12,753,754,759],{},[755,756],"img",{"alt":757,"src":758},"Login","\u002FPassprotect\u002Flogin.png",[755,760],{"alt":761,"src":762},"Register","\u002FPassprotect\u002Fregister.png",[12,764,765],{},"Une fois connecté, vous pouvez visualiser la liste de vos données cryptées. A ce moment les données ne sont pas cryptées.",[12,767,768],{},[755,769],{"alt":770,"src":771},"Ma liste","\u002FPassprotect\u002Fliste.png",[12,773,774],{},"Et enfin vous pouvez visualiser le détail de vos données sauvegardées.",[12,776,777,781,785],{},[755,778],{"alt":779,"src":780},"Détail du texte","\u002FPassprotect\u002Fdetail_text.png",[755,782],{"alt":783,"src":784},"Détail du mot de passe","\u002FPassprotect\u002Fdetail_password.png",[755,786],{"alt":787,"src":788},"Détail de la carte de paiement","\u002FPassprotect\u002Fdetail_card.png",[45,790,792],{"id":791},"comment-les-données-sont-cryptées","Comment les données sont cryptées",[12,794,795],{},"Lors de la création de l'utilisateur, l'application crée alors 2 clés :",[68,797,798,801],{},[71,799,800],{},"La clé maître, utilisée pour chiffrer les mots de passe, cartes de crédit, et textes (à l'aide de la méthode AES-256-CTR) en tous genre. Cette clé est elle-même chiffrée avec\nle mot de passe de l'utilisateur et le sel (16 octets aléatoires). La clé maître est générée à partir de 32 octets choisis aléatoirement,",[71,802,803],{},"La clé de session utilisé pour chiffrer le jeton JWT contenant la clé maître lors de la session: Cette clé générée à partir de 32 octets choisis aléatoirement.",[12,805,806],{},"Lors de la sauvegarde d'une ligne, la clé maître est utilisée pour chiffrer les données, et inversement quand la clé est lue, la clé maître est utilisée pour les déchiffrer.",[12,808,809],{},"Seul l'utilisateur connecté a accès à ses propres données (chiffrées). Le chiffrage est fait côté serveur par le nodejs. Du coup les données transitant en clair vers le client, il\nfaut que le site soit accédé à partir d'un serveur en HTTPS.",[130,811,813],{"id":812},"installation","Installation",[815,816,818],"h3",{"id":817},"attention","Attention",[12,820,821],{},"Attention, j'essaie de rendre passprotect le plus sécurisé possible mais je ne suis pas un expert en cryptographie. Sauf si vous savez estimer le niveau de sécurité de l'application,\nl'utilisation de l'application pour protéger des données importantes se fait à vos risques et périls.",[815,823,825],{"id":824},"les-pré-requis","Les pré-requis",[68,827,828,831],{},[71,829,830],{},"NodeJS > 6.2.1",[71,832,833],{},"MongoDB > 3.2.7",[815,835,837],{"id":836},"depuis-les-sources","Depuis les sources",[192,839,843],{"className":840,"code":841,"language":842,"meta":197,"style":197},"language-bash shiki shiki-themes one-dark-pro","    hg clone https:\u002F\u002Fgithub.com\u002Fphoenix741\u002Fpassprotect-server\n    npm install\n    MODE=prod npm run build\n","bash",[22,844,845,857,865],{"__ignoreMap":197},[201,846,847,851,854],{"class":203,"line":204},[201,848,850],{"class":849},"sVbv2","    hg",[201,852,853],{"class":215}," clone",[201,855,856],{"class":215}," https:\u002F\u002Fgithub.com\u002Fphoenix741\u002Fpassprotect-server\n",[201,858,859,862],{"class":203,"line":219},[201,860,861],{"class":849},"    npm",[201,863,864],{"class":215}," install\n",[201,866,867,870,874,877,880,883],{"class":203,"line":226},[201,868,869],{"class":207},"    MODE",[201,871,873],{"class":872},"sjrmR","=",[201,875,876],{"class":215},"prod",[201,878,879],{"class":849}," npm",[201,881,882],{"class":215}," run",[201,884,885],{"class":215}," build\n",[815,887,889],{"id":888},"depuis-docker","Depuis docker",[12,891,892,893,896],{},"En utilisant ",[22,894,895],{},"docker-compose"," vous pouvez instancier les différentes images avec le fichier de configuration suivant. Pensez à modifier les clés servers.",[192,898,900],{"className":194,"code":899,"language":196,"meta":197,"style":197},"version: \"2\"\nservices:\n  nodejs:\n    image: phoenix741\u002Fpassprotect-server:1.0.0\n    expose:\n      - 3000\n    links:\n      - mongodb\n    environment:\n      - MONGODB_HOST=mongodb:\u002F\u002Fmongodb:27017\u002Fpassprotect\n      - NODE_ENV=production\n      - DEBUG=App:*\n      - JWT_SECRET=dnLUMtULQsNmNbmGV3Lx8SxrxEtaxTc8aPdRh8YMemj515Faip7wQYueSaBFYm5r\n      - CRYPTO_SESSIONKEY=xtipKI38GUCvE5cNGtTJxa1wQFvCicF5GDLTWyaBAb5RQqQ8rRBR1yVEq7Jg10cu\n  nginx:\n    image: phoenix741\u002Fpassprotect-client:1.0.0\n    links:\n      - nodejs\n    environment:\n      - UPSTREAM_SERVER=nodejs\n      - UPSTREAM_PORT=3000\n      - PIWIK_SITE_URL=\u002F\u002Fstats-demo.shadoware.org\u002F\n      - PIWIK_SITE_ID=3\n    ports:\n      - \"8080:80\"\n  mongodb:\n    image: mongo:3.3.9\n    expose:\n      - 27017\n    volumes:\n      - \".\u002Fmongodb:\u002Fdata\"\n",[22,901,902,911,917,924,933,940,948,955,962,968,975,982,989,996,1003,1010,1019,1025,1032,1038,1045,1052,1059,1066,1073,1080,1087,1096,1102,1109,1115],{"__ignoreMap":197},[201,903,904,906,908],{"class":203,"line":204},[201,905,208],{"class":207},[201,907,212],{"class":211},[201,909,910],{"class":215},"\"2\"\n",[201,912,913,915],{"class":203,"line":219},[201,914,295],{"class":207},[201,916,232],{"class":211},[201,918,919,922],{"class":203,"line":226},[201,920,921],{"class":207},"  nodejs",[201,923,232],{"class":211},[201,925,926,928,930],{"class":203,"line":235},[201,927,311],{"class":207},[201,929,212],{"class":211},[201,931,932],{"class":215},"phoenix741\u002Fpassprotect-server:1.0.0\n",[201,934,935,938],{"class":203,"line":243},[201,936,937],{"class":207},"    expose",[201,939,232],{"class":211},[201,941,942,944],{"class":203,"line":251},[201,943,330],{"class":211},[201,945,947],{"class":946},"sVC51","3000\n",[201,949,950,953],{"class":203,"line":262},[201,951,952],{"class":207},"    links",[201,954,232],{"class":211},[201,956,957,959],{"class":203,"line":270},[201,958,330],{"class":211},[201,960,961],{"class":215},"mongodb\n",[201,963,964,966],{"class":203,"line":277},[201,965,339],{"class":207},[201,967,232],{"class":211},[201,969,970,972],{"class":203,"line":287},[201,971,330],{"class":211},[201,973,974],{"class":215},"MONGODB_HOST=mongodb:\u002F\u002Fmongodb:27017\u002Fpassprotect\n",[201,976,977,979],{"class":203,"line":292},[201,978,330],{"class":211},[201,980,981],{"class":215},"NODE_ENV=production\n",[201,983,984,986],{"class":203,"line":300},[201,985,330],{"class":211},[201,987,988],{"class":215},"DEBUG=App:*\n",[201,990,991,993],{"class":203,"line":308},[201,992,330],{"class":211},[201,994,995],{"class":215},"JWT_SECRET=dnLUMtULQsNmNbmGV3Lx8SxrxEtaxTc8aPdRh8YMemj515Faip7wQYueSaBFYm5r\n",[201,997,998,1000],{"class":203,"line":319},[201,999,330],{"class":211},[201,1001,1002],{"class":215},"CRYPTO_SESSIONKEY=xtipKI38GUCvE5cNGtTJxa1wQFvCicF5GDLTWyaBAb5RQqQ8rRBR1yVEq7Jg10cu\n",[201,1004,1005,1008],{"class":203,"line":327},[201,1006,1007],{"class":207},"  nginx",[201,1009,232],{"class":211},[201,1011,1012,1014,1016],{"class":203,"line":336},[201,1013,311],{"class":207},[201,1015,212],{"class":211},[201,1017,1018],{"class":215},"phoenix741\u002Fpassprotect-client:1.0.0\n",[201,1020,1021,1023],{"class":203,"line":344},[201,1022,952],{"class":207},[201,1024,232],{"class":211},[201,1026,1027,1029],{"class":203,"line":352},[201,1028,330],{"class":211},[201,1030,1031],{"class":215},"nodejs\n",[201,1033,1034,1036],{"class":203,"line":360},[201,1035,339],{"class":207},[201,1037,232],{"class":211},[201,1039,1040,1042],{"class":203,"line":368},[201,1041,330],{"class":211},[201,1043,1044],{"class":215},"UPSTREAM_SERVER=nodejs\n",[201,1046,1047,1049],{"class":203,"line":376},[201,1048,330],{"class":211},[201,1050,1051],{"class":215},"UPSTREAM_PORT=3000\n",[201,1053,1054,1056],{"class":203,"line":384},[201,1055,330],{"class":211},[201,1057,1058],{"class":215},"PIWIK_SITE_URL=\u002F\u002Fstats-demo.shadoware.org\u002F\n",[201,1060,1061,1063],{"class":203,"line":392},[201,1062,330],{"class":211},[201,1064,1065],{"class":215},"PIWIK_SITE_ID=3\n",[201,1067,1068,1071],{"class":203,"line":400},[201,1069,1070],{"class":207},"    ports",[201,1072,232],{"class":211},[201,1074,1075,1077],{"class":203,"line":408},[201,1076,330],{"class":211},[201,1078,1079],{"class":215},"\"8080:80\"\n",[201,1081,1082,1085],{"class":203,"line":415},[201,1083,1084],{"class":207},"  mongodb",[201,1086,232],{"class":211},[201,1088,1089,1091,1093],{"class":203,"line":422},[201,1090,311],{"class":207},[201,1092,212],{"class":211},[201,1094,1095],{"class":215},"mongo:3.3.9\n",[201,1097,1098,1100],{"class":203,"line":430},[201,1099,937],{"class":207},[201,1101,232],{"class":211},[201,1103,1104,1106],{"class":203,"line":438},[201,1105,330],{"class":211},[201,1107,1108],{"class":946},"27017\n",[201,1110,1111,1113],{"class":203,"line":447},[201,1112,322],{"class":207},[201,1114,232],{"class":211},[201,1116,1117,1119],{"class":203,"line":455},[201,1118,330],{"class":211},[201,1120,1121],{"class":215},"\".\u002Fmongodb:\u002Fdata\"\n",[12,1123,1124],{},"L'application est composée de deux images docker :",[68,1126,1127,1133],{},[71,1128,1129,1132],{},[22,1130,1131],{},"phoenix741\u002Fpassprotect-server:1.0.0",": contenant la partie serveur nodejs",[71,1134,1135,1138],{},[22,1136,1137],{},"phoenix741\u002Fpassprotect-client:1.0.0",": servant les fichiers static et redirigeant les appels à l'API vers le serveur.",[12,1140,1141],{},"La troisième image contient la base de données mongodb utilisée par le projet.",[130,1143,1145],{"id":1144},"utilisation","Utilisation",[12,1147,1148,1149,1152],{},"Pour accéder au serveur, utiliser l'adresse ",[22,1150,1151],{},"http:\u002F\u002Flocalhost:8080"," dans votre navigateur.",[638,1154,1155],{},"html pre.shiki code .sVbv2, html code.shiki .sVbv2{--shiki-default:#61AFEF}html pre.shiki code .subq3, html code.shiki .subq3{--shiki-default:#98C379}html pre.shiki code .sVyAn, html code.shiki .sVyAn{--shiki-default:#E06C75}html pre.shiki code .sjrmR, html code.shiki .sjrmR{--shiki-default:#56B6C2}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sn6KH, html code.shiki .sn6KH{--shiki-default:#ABB2BF}html pre.shiki code .sVC51, html code.shiki .sVC51{--shiki-default:#D19A66}",{"title":197,"searchDepth":219,"depth":219,"links":1157},[1158,1164],{"id":812,"depth":219,"text":813,"children":1159},[1160,1161,1162,1163],{"id":817,"depth":226,"text":818},{"id":824,"depth":226,"text":825},{"id":836,"depth":226,"text":837},{"id":888,"depth":226,"text":889},{"id":1144,"depth":219,"text":1145},"2016-10-02",{"type":9,"value":1167},[1168,1170,1172,1174,1178,1200],[12,1169,14],{},[12,1171,688],{},[45,1173,692],{"id":691},[12,1175,695,1176,700],{},[697,1177,699],{},[68,1179,1180,1185,1190,1195],{},[71,1181,1182,710],{},[30,1183,709],{"href":707,"rel":1184},[34],[71,1186,1187,718],{},[30,1188,717],{"href":715,"rel":1189},[34],[71,1191,1192,726],{},[30,1193,725],{"href":723,"rel":1194},[34],[71,1196,1197,734],{},[30,1198,733],{"href":731,"rel":1199},[34],[12,1201,737],{},{"planet":222},"\u002Fpost\u002Fpresentation-passprotect",{"title":681,"description":14},"presentation-passprotect","posts\u002FPassprotect\u002F2016-10-02-presentation-passprotect",[645,675,676,677],"CCmSZITdHfrTxlAN2-s6g_tkrpyHzhmvPrXpWcOyZzA",1777849586940]