察称æå·åãé察称ããã€ããªãããé«ã¬ãã«ãäœã¬ãã«ãã¹ããªãŒã ããã³ææ°ã®æ¥åæå·ã æå·åã«é¢ãããããªã®56åãããã³ã¯ããã«é«é-ããã¹ãã®åœ¢åŒã§ã
ã«ããã®äž-ãããªãã¹ã©ã€ãã翻蚳ã èªæžãã楜ãã¿ãã ããïŒ
ã¹ã©ã€ã
ç§ã®ååã¯ã¹ã¿ã³ã»ãã©ããã³ã§ããç§ã¯æ å ±ã»ãã¥ãªãã£ãšèŠå¶é å®ãå°éãšããäŒç€Ÿã®ãã¯ãã«ã«ãã£ã¬ã¯ã¿ãŒã§ãã ããã«ãç§ã¯ããã€ãã®ãªãŒãã³ãœãŒã¹ã©ã€ãã©ãªã®äœæè ã§ãããããããã¯ã³ãã¥ããã£ããéåžžã«å¥œè©ã§ãã ã€ã³ãã§ã«ããèãã人ã¯äœäººã§ããïŒ ãã®ã©ã€ãã©ãªã¯ã.NETã§ã®æå·åãžã®æ£ããã¢ãããŒãã瀺ããŠããã TinyORMã¯.NETã®micro-ORMãå®è£ ããŠããŸãã ããã«ãä»æ¥ã®èšäºã®ãããã¯ã«é¢é£ããå¯èœæ§ã®ããæ¬ãããã€ãæžããŠããŸãã ãã®1ã€ã§ãã2014幎çã¯ãSecurity Driven .NETãã§ããã2017幎ã®ãã1ã€ã¯ãApplication Security in .NETãSuccinctlyãã§ãã
æåã«ãæå·ååçºã®4ã€ã®æ®µéãšåŒã¶ãã®ã«ã€ããŠèª¬æããŸãã 次ã«ã2ã€ã®äž»èŠãªãããã¯ãç¶ããŸããæåã®ãããã¯ã§ã¯å¯Ÿç§°æå·åã«ã€ããŠã2çªç®ã®ãããã¯ã§ã¯é察称ããã³ãã€ããªããã«ã€ããŠèª¬æããŸãã æåã®éšåã§ã¯ãé«ã¬ãã«æå·ãšäœã¬ãã«æå·ãæ¯èŒããã¹ããªãŒãã³ã°æå·ã®äŸãèŠãŠã¿ãŸãããã 第2éšã§ã¯ãRSAã§å€ãã®ãåéºããè¡ãããã®åŸãçŸä»£ã®æ¥åæå·ã«ç²ŸéããŸãã
ã§ã¯ãæå·ååçºã®ãããã®æ®µéã¯ã©ã®ããã«èŠããã®ã§ããããïŒ æåã®æ®µéã¯ããXORã¯ãšãŠãã¯ãŒã«ã ãèŠãŠããæ¯ãããã©ãããã°ãããïŒãã§ããããªãã®å€ãã¯ãã£ãšãã®æ®µéã«ç²ŸéããŠãããXORæ©èœã®çŽ æŽããããç¥ã£ãŠããŸãã ãããããã®æ®µéã®å€§éšåãæé·ãã次ã®æ®µéãã€ãŸãåºãç¥ãããé«ãè©äŸ¡ãããŠããã¢ã«ãŽãªãºã ã§ããAESïŒAdvanced Encryption StandardïŒã䜿çšããŠæå·åãšåŸ©å·åãå®è¡ããããšãåŠãã ããšãé¡ã£ãŠããŸãã DotNextã«ã¢ã¯ã»ã¹ããªãã»ãšãã©ã®éçºè ã¯ãã®æ®µéã§ãã ããããDotNextã«åŸããäœã¬ãã«APIã®å±éºæ§ã«é¢ããã¬ããŒãã«ç²ŸéããŠããããã次ã®æ®µéã«ããå¯èœæ§ãé«ãã§ãããã ãŸããå šäœåãå®æãããããã«ãæåŸã®æ®µéã«ãèšåããŸã-åé¡ã«å¯Ÿããæåã®è§£æ±ºçã§ã¯ãæå·åã¯ãŸã£ããå¿ èŠãªããããããªããšããç解ã§ãã ãã®æ®µéã¯å°éããã®ãæãé£ããã人ãã»ãšãã©ããŸããã ããšãã°ãããŒã¿ãŒG.ãã€ãã³ã¯æ¬¡ã®ããã«èªã£ãŠããŸãããåé¡ã®è§£æ±ºçãæå·åã«ãããšèããŠããå Žåãåé¡ã®å 容ãæ£ç¢ºã«ç解ããããšã¯ã§ããŸãããã
äœã¬ãã«æå·åãå±éºã§ãããšããäºå®ã¯ã.NETã«é¢ããå€ãã®ã¬ããŒãã§è°è«ãããŠããŸãã 2015幎ã®Vladimir Kochetkovã®ã¬ããŒããPitfalls of System.Security.Cryptographyããåç §ã§ããŸã ã 圌ã®äž»ãªã¢ã€ãã¢ã¯ãäœã¬ãã«ã®æå·åAPIã䜿çšããå段éã§ãç¥ããªããã¡ã«å€ãã®æ±ºå®ãäžãããšã§ããããã®å€ãã«ã€ããŠã¯é©åãªç¥èããããŸããã äž»ãªçµè«ã¯ãçæ³çã«ã¯ãäœã¬ãã«æå·åã®ä»£ããã«é«ã¬ãã«æå·åã䜿çšããå¿ èŠããããšããããšã§ãã ããã¯çŽ æŽãããçµè«ã§ãããå¥ã®åé¡ã«ã€ãªãããŸã-é«ã¬ãã«ã®æå·åãã©ã®ããã«èŠããã¹ãããæ£ç¢ºã«ç¥ã£ãŠããŸããïŒ ããã«ã€ããŠå°ã話ããŸãããã
éé«ã¬ãã«æå·åAPIã®å±æ§ãå®çŸ©ããŸãã ããããããã®ãããªAPIã¯.NETã«ãã€ãã£ãã§ãããšããå°è±¡ãäžããã®ã§ã¯ãªããäœã¬ãã«ã®ã·ã§ã«ã®ããã«èŠããŸãã ããã«ããã®ãããªAPIã¯ç°¡åã«èª€ã£ãŠäœ¿çšãããŸãã ããã§ã¯ãããŸããã ããã«ããã³ã¹ãåæåãã¯ãã«ãªã©ãå€ãã®å¥åŠãªäœã¬ãã«ã®ãã®ãçæããããšã匷å¶ããŸãã ãã®ãããªAPIã䜿çšãããšãã¢ã«ãŽãªãºã ãããã£ã³ã°ã¢ãŒããããŒãµã€ãºããã³ã¹ãªã©ãéžæããã®ã§ã¯ãªããäžå¿«ãªå€æãäžãããšã«ãªããŸãã ãŸããã¹ããªãŒãã³ã°çšã®æ£ããAPIïŒã¹ããªãŒãã³ã°APIïŒããããŸãããåŸè ã®å€èŠ³ã«ã€ããŠèª¬æããŸãã
å¯Ÿç §çã«ãé«ã¬ãã«ã®æå·åAPIã¯ã©ã®ããã«èŠããã¹ãã§ããïŒ ãããããã³ãŒãã®èªã¿åããšæžã蟌ã¿ã®äž¡æ¹ã«ã€ããŠãçŽæçãã€ç°¡æœã§ãªããã°ãªããŸããã ããã«ããã®ãããªAPIã¯ç°¡åã«ç¿åŸããŠäœ¿çšã§ããééã£ãæ¹æ³ã§é©çšããããšã¯éåžžã«é£ããã¯ãã§ãã ãŸãã匷åã§ããå¿ èŠããããŸããã€ãŸããå°ãã®åŽåãšå°éã®ã³ãŒãã§ç®æšãéæã§ããå¿ èŠããããŸãã æåŸã«ããã®ãããªAPIã«ã¯äžè¬ã«å¶éãèŠåãç¹æ®ãªã±ãŒã¹ã®é·ããªã¹ããå«ããã¹ãã§ã¯ãããŸãã-ãããæäœããéã«èŠããŠããå¿ èŠã®ããæå°éã®ãã®ãããã¯ãã§ã-èšãæããã°ãäœã¬ãã«ã®å¹²æžïŒäœæ©æŠïŒã«ãã£ãŠç¹åŸŽä»ããããã¹ãã§ãäºçŽãªãã§åäœããŸãã
.NETã®é«ã¬ãã«æå·åAPIã®èŠä»¶ãç解ããã®ã§ãä»ã©ã®ããã«ãããèŠã€ããã®ã§ããããïŒ ããªãã¯ãã ã°ãŒã°ã«ãè©Šãããšãã§ããŸãããããã¯ããŸãã«ãåå§çã§ã-ç§ãã¡ã¯ããã®éçºè ã§ãããããã¯ç§ãã¡ã®æ¹æ³ã§ã¯ãããŸããã ãã®ããããã®åé¡ã調æ»ããããŸããŸãªéžæè¢ããã¹ãããŠããŸãã ãã ãããã®ããã«ã¯ããŸããèªèšŒãããæå·åãšã¯äœããšããæ£ããèããèªåèªèº«ã§è£ãå¿ èŠãããããã®ããã«ã¯åºæ¬çãªæŠå¿µãç解ããå¿ èŠããããŸãã ãããã¯æ¬¡ã®ãšããã§ãããã¬ãŒã³ããã¹ãPïŒãã¬ãŒã³ããã¹ãïŒãããã¯ãç§å¯ããŒKïŒããŒïŒã䜿çšããŠåãé·ãã®æå·ããã¹ãCïŒæå·ããã¹ãïŒã«å€æããŸãã ã芧ã®ãšããããããŸã§ã®ãšãããéåžžã«åçŽãªã¹ããŒã ã䜿çšããŠããŸãã ããã«ãèªèšŒã¿ã°Tãšnonce NããããŸããéèŠãªãã©ã¡ãŒã¿ãŒã¯NÌ ã§ããã€ãŸãã1ã€ã®ããŒã§nonceãåå©çšããŸãã ãããããåç¥ã®ããã«ãããã¯ããã¹ãã®æ©å¯æ§ã®äŸµå®³ã«ã€ãªãããŸãããããã¯æããã«æãŸãããããŸããã ãã1ã€ã®éèŠãªæŠå¿µã¯ADïŒé¢é£ããŒã¿ïŒãã€ãŸãé¢é£ããŒã¿ã§ãã ããã¯èªèšŒããããªãã·ã§ã³ã®ããŒã¿ã§ãããæå·åãšåŸ©å·åã«ã¯é¢äžããŸããã
åºæ¬æŠå¿µãç解ããã®ã§ã.NETã®æå·åã©ã€ãã©ãªã®ããŸããŸãªãªãã·ã§ã³ãèŠãŠã¿ãŸãããã Libsodium.NETãåæããããšããå§ããŸãããã 圌女ãäœäººç¥ã£ãŠããŸããïŒ ç§ãèŠãããã«ãããã€ãã¯ããªãã¿ã§ãã
nonce = SecretAeadAes.GenerateNonce(); c = SecretAeadAes.Encrypt(p, nonce, key, ad); d = SecretAeadAes.Decrypt(c, nonce, key, ad);
æå·åãLibsodium.NETã§å®è¡ãããCïŒã³ãŒãã¯æ¬¡ã®ãšããã§ãã äžèŠãããšãããã¯éåžžã«ã·ã³ãã«ã§ç°¡æœã§ãã1è¡ç®ã§ã¯ãã³ã¹ãçæããã2è¡ç®ã§ã¯æå·åèªäœãè¡ããã3è¡ç®ã§ã¯ããã¹ãã埩å·åãããŸãã ããã¯æããã-ã©ã®ãããªå°é£ãããå¯èœæ§ããããŸããïŒ ãããããLibsodium.NETã¯å¯Ÿç§°æå·åã®1ã€ã§ã¯ãªã3ã€ã®ç°ãªãæ¹æ³ãæäŸããŸãïŒ
å
nonce = SecretAeadAes.GenerateNonce(); c = SecretAeadAes.Encrypt(p, nonce, key, ad); d = SecretAeadAes.Decrypt(c, nonce, key, ad);
äº
nonce = SecretAead.GenerateNonce(); c = SecretAead.Encrypt(p, nonce, key, ad); d = SecretAead.Decrypt(c, nonce, key. ad);
äž
nonce = SecretBox.GenerateNonce(); c = SecretBox.Create(p, nonce, key); d = SecretBox.Open(c, nonce, key);
æããã«ãåé¡ãçºçããŸã-ããªãã®ç¹å®ã®ç¶æ³ã§ã©ã¡ããè¯ãã§ããïŒ ããã«çããã«ã¯ããããã®ã¡ãœããã®å éšã«å ¥ãå¿ èŠããããŸãã
æåã®ã¡ãœãã
SecretAeadAes
ã¯ã96ãããã®ãã³ã¹ã§AES-GCMã䜿çšããŸãã 圌ãããªãé·ãå¶éãªã¹ããæã£ãŠããããšãéèŠã§ãã ããšãã°ãããã䜿çšããå Žåã1ã€ã®ããŒã§550ã®ã¬ãã€ããè¶ ããŠæå·åããã¹ãã§ã¯ãããŸããããŸãã1ã€ã®ã¡ãã»ãŒãžã§æ倧2 32ã®ã¡ãã»ãŒãžãå«ã64ã®ã¬ãã€ããè¶ ããŠã¯ãªããŸããã ããã«ãã©ã€ãã©ãªã¯ãããã®å¶éã«è¿ã¥ããŠããããšãèŠåããŠããŸãããããªãã¯ããããèªåã§è¿œè·¡ããå¿ èŠããããéçºè ãšããŠããªãã«è¿œå ã®è² æ ããããŸãã
2çªç®ã®æ¹æ³ã§ãã
SecretAead
ã¯ãç°ãªãæå·ã¹ã€ãŒã
ChaCha20/Poly1305
ããå€§å¹ ã«å°ãã64ãããã®ãã³ã¹ã䜿çšããŸãã ãã®ãããªå°ããªãã³ã¹ã¯è¡çªã極ããŠå¯èœæ§ãé«ãããããã®çç±ã ãã§ããã®æ¹æ³ã¯äœ¿çšããªãã§ãã ãã-éåžžã«ãŸããªã±ãŒã¹ãé€ãããããã¯ã«ç²ŸéããŠããå Žåãé€ããŸãã
æåŸã«ã3çªç®ã®ã¡ãœãã
SecretBox
ã ãã®APIã®åŒæ°ã«ã¯é¢é£ããããŒã¿ããªãããšã«æ³šæããŠãã ããã ADã§èªèšŒãããæå·åãå¿ èŠãªå Žåããã®æ¹æ³ã¯é©ããŠããŸããã ããã§äœ¿çšãããæå·åã¢ã«ãŽãªãºã ã¯
xSalsa20/Poly1305
ãšåŒã°ãããã³ã¹ã¯ååã«å€§ãã
xSalsa20/Poly1305
ãããã§ãã ãã ããADã®æ¬ åŠã¯é倧ãªå¶éã§ãã
Libsodium.NETã䜿çšãããš ãããã€ãã®çåãçããŸãã ããšãã°ãäžèšã®äŸã®ã³ãŒãã®æåã®è¡ã§çæããããã³ã¹ã䜿çšããŠãæ£ç¢ºã«äœããã¹ãã§ããããïŒ ã©ã€ãã©ãªã¯ããã«ã€ããŠäœãæããŠãããŸãããç§ãã¡ã¯èªåã§ãããç解ããªããã°ãªããŸããã ã»ãšãã©ã®å Žåããã®ãã³ã¹ãæå·æã®æåãŸãã¯æåŸã«æåã§è¿œå ããŸãã ããã«ãæåã®2ã€ã®æ¹æ³ã®ADã®é·ãã«ã¯å¶éããªããšããå°è±¡ãåãããããããŸããã ããããå®éã«ã¯ãã©ã€ãã©ãªã¯16ãã€ã以äžã®ADããµããŒãããŠããŸããçµå±ã®ãšããã16ãã€ãã§ååã§ãã ç¶ããŸãããã 埩å·åãšã©ãŒã¯ã©ããªããŸããïŒ ãã®ã©ã€ãã©ãªã§ã¯ããããã®å Žåã«äŸå€ãã¹ããŒããããšã決å®ãããŸããã 埩å·åäžã®ç°å¢ã§ããŒã¿ã®æŽåæ§ã䟵害ãããå¯èœæ§ãããå Žåãå€ãã®äŸå€ãåŠçããå¿ èŠããããŸãã ããŒãµã€ãºãæ£ç¢ºã«32ãã€ãã§ã¯ãªãå Žåã¯ã©ããªããŸããïŒ ã©ã€ãã©ãªã¯ããã«ã€ããŠã¯äœãæããŠãããŸããããããã¯ããªããèå³ãæããªãåé¡ã§ãã å¥ã®éèŠãªãããã¯ã¯ãéäžçãªã·ããªãªã§ã¬ããŒãžã³ã¬ã¯ã¿ãŒã®è² è·ã軜æžããããã®ãã€ãé åã®åå©çšã§ãã ããšãã°ãã³ãŒãã§ã¯ãnonceãžã§ãã¬ãŒã¿ãŒãè¿ãé åã確èªããŸããã æ¯åæ°ãããããã¡ãäœæããã®ã§ã¯ãªããæ¢åã®ãããã¡ãåå©çšããããšæããŸãã ããã¯ãã®ã©ã€ãã©ãªã§ã¯äžå¯èœã§ããããã€ãã®é åã¯æ¯ååçæãããŸãã
ãã§ã«èŠãã¹ããŒã ã䜿çšããŠãããŸããŸãªLibsodium.NETã¢ã«ãŽãªãºã ã®æ¯èŒãè©Šã¿ãŸãã
æåã®ã¢ã«ãŽãªãºã ã§ããAES-GCMã¯ã96ãããé·ã®ãã³ã¹ã䜿çšããŸãïŒå³ã®é»è²ã®åïŒã 128ãããæªæºã§ãããããå€å°ã®äžå¿«æãçããŸãããããã»ã©éèŠã§ã¯ãããŸããã 次ã®åã¯éã§ããããã¯èªèšŒã¿ã°ãå ããå Žæã§ãAES-GCMã§ã¯16ãã€ããŸãã¯128ãããã§ãã æ¬åŒ§å ã®2çªç®ã®éãæ°åã¯ããã®ã¿ã°ã«å«ãŸãããšã³ããããŒãŸãã¯ã©ã³ãã æ§ã®éãæå³ããŸã-128ãããæªæºã ã©ãã ãå°ãªã-ãã®ã¢ã«ãŽãªãºã ã§ã¯ãæå·åãããããŒã¿ã®éã«äŸåããŸãã æå·åããã»ã©ãã¿ã°ã¯åŒ±ããªããŸãã ããã ãã§ãããã®ã¢ã«ãŽãªãºã ã«é¢ããçåãçããã¯ãã§ãããçœãåãèŠããšå¢å ããŸãã ãã³ã¹ã®ç¹°ãè¿ãïŒè¡çªïŒã¯ãåãããŒã§äœæããããã¹ãŠã®æå·æã®åœé ã«ã€ãªãããšèšãããŠããŸãã ããšãã°ã2ã€ã®å ±éããŒã«ãã£ãŠäœæããã100åã®æå·ããã¹ãã®ãã¡ããã³ã¹ã®è¡çªãããå Žåããã®ãã³ã¹ã¯èªèšŒããŒã®å éšãªãŒã¯ãåŒãèµ·ãããæ»æè ããã®ããŒã«ãã£ãŠäœæãããä»ã®æå·ããã¹ããåœé ã§ããããã«ããŸãã ããã¯éåžžã«éèŠãªå¶éã§ãã
2çªç®ã®Libsodium.NETã¡ãœããã«é²ã¿ãŸãããã å ã»ã©èšã£ãããã«ãããã§ã¯äžåã ãã䜿çšãããã¹ããŒã¹ãå°ãªãããŠ64ããããããããŸããã ã¿ã°ã¯128ããããå æããŸããããšã³ããããŒã¯106ããã以äžãã€ãŸããã»ãšãã©ã®å Žåéæããããšãã128ãããã®ã»ãã¥ãªãã£ã¬ãã«ãããå€§å¹ ã«äœãã§ãã åœé ã«é¢ããŠã¯ãããã§ã®ç¶æ³ã¯AES-GCMã®å Žåãããè¥å¹²è¯ããªã£ãŠããŸãã ãã³ã¹ã®è¡çªã¯æå·æã®æ¹ããã«ã€ãªãããŸãããè¡çªãçºçãããããã¯ã®ã¿ã§ãã åã®äŸã§ã¯ã100ã§ã¯ãªã2ã€ã®æå·æãåœé ããŠããŸããã
æåŸã«ãxSalsa / Polyã¢ã«ãŽãªãºã ã®å Žåã192ãããã®éåžžã«å€§ããªãã³ã¹ããããè¡çªãéåžžã«èµ·ããã«ãããªããŸãã èªèšŒæ¹æ³ã¯åã®æ¹æ³ãšåãã§ãããããã¿ã°ã¯åã³128ãããã䜿çšãã106ããã以äžã®ãšã³ããããŒãæã¡ãŸãã
ãããã®ãã¹ãŠã®æ°å€ãã Infernoã©ã€ãã©ãªã®å¯Ÿå¿ããã€ã³ãžã±ãŒã¿ãŒãšæ¯èŒããŸãã ãã®äžã§ããã³ã¹ã¯ã320ãããã®å·šå€§ãªã¹ããŒã¹ãå æããè¡çªãã»ãšãã©äžå¯èœã«ããŸãã ã¿ã°ã«ã€ããŠã¯ããã¹ãŠãã·ã³ãã«ã§ããæ£ç¢ºã«128ããããå æããæ£ç¢ºã«128ãããã®ãšã³ããããŒãæã£ãŠããŸãã ããã¯ãä¿¡é Œæ§ãé«ãå®å šãªã¢ãããŒãã®äŸã§ãã
Libsodium.NETã®è©³çŽ°ãç¥ãåã«ããã®ç®çãç解ããå¿ èŠããããŸã-æ®å¿µãªããããã®ã©ã€ãã©ãªã䜿çšãããã¹ãŠã®äººãèªèããŠããããã§ã¯ãããŸããã ãããè¡ãã«ã¯ã Libsodium.NETãlibsodiumã®CïŒã©ãããŒã§ãããšè¿°ã¹ãŠããããã¥ã¡ã³ããåç §ããŠãã ããã ããã¯å¥ã®ãªãŒãã³ãœãŒã¹ãããžã§ã¯ãã§ããããã®ããã¥ã¡ã³ãã«ã¯ãäºææ§ã®ããAPIãåããNaClã®ãã©ãŒã¯ã§ããããšãèšèŒãããŠããŸãã ããŠãå¥ã®ãªãŒãã³ãœãŒã¹ãããžã§ã¯ãã§ããNaClã®ããã¥ã¡ã³ããåç §ããŠãã ããã ãã®äžã§ãç®æšãšããŠã NaClã¯é«åºŠãªæå·åããŒã«ãäœæããããã«å¿ èŠãªãã¹ãŠã®æäœãæäŸãããšä»®å®ãããŠããŸãã ç¬ãåè¬ãããã®ã¯ããã§ããNaClãšãã®ãã¹ãŠã®ã·ã§ã«ã®ã¿ã¹ã¯ã¯ãäœã¬ãã«ã®èŠçŽ ãæäŸããããšã§ããããããã誰ãããã§ã«é«ã¬ãã«ã®æå·åAPIãçµã¿ç«ãŠãããšãã§ããŸãã é«ã¬ãã«ã®ã©ã€ãã©ãªãšããŠã®ãããã®ã·ã§ã«èªäœã¯èæ¡ãããŠããŸããã ãããã£ãŠãã¢ã©ã«ïŒé«ã¬ãã«ã®æå·åAPIãå¿ èŠãªå Žåãé«ã¬ãã«ã®ã©ã€ãã©ãªãèŠã€ããäœã¬ãã«ã®ã©ãããŒã䜿çšãããé«ã¬ãã«ã®ã©ã€ãã©ãªã§äœæ¥ããŠãããµããããå¿ èŠããããŸãã
Infernoã§ã®æå·åã®ä»çµã¿ãèŠãŠã¿ãŸãããã
Libsodiumã®å Žåã®ããã« ãåæå·åãšåŸ©å·åã«å¿ èŠãªã³ãŒãã¯1è¡ã®ã¿ã§ãã åŒæ°ã¯ãããŒãããã¹ããããã³ãªãã·ã§ã³ã®é¢é£ããŒã¿ã§ãã ãã³ã¹ããªãã決å®ãè¡ãå¿ èŠããªãããšã«æ³šæããå¿ èŠããããŸãã埩å·åãšã©ãŒã®å ŽåãäŸå€ãã¹ããŒããã«nullãè¿ãããã ãã§ãã äŸå€ãäœæãããšãã¬ããŒãžã³ã¬ã¯ã¿ã®è² è·ãå€§å¹ ã«å¢å ãããããäŸå€ãååšããªãããšã¯ã倧ããªããŒã¿ã¹ããªãŒã ãåŠçããã¹ã¯ãªããã«ãšã£ãŠéåžžã«éèŠã§ãã ãã®ã¢ãããŒããæé©ã§ãããšçŽåŸã§ããããšãé¡ã£ãŠããŸãã
èå³æ·±ãããšã«ãæååãæå·åããŠã¿ãŸãããã ããã¯ã誰ã§ãå®è£ ã§ããæãåçŽãªã·ããªãªã§ãªããã°ãªããŸããã ãLEFTããšãRIGHTãã®2ã€ã®ç°ãªãæååå€ãã䜿çšã§ããªããšããŸãã
åçã§ã¯ã Infernoã䜿çšãããããã®è¡ã®æå·åã確èªã§ããŸãïŒãã ãããã®äŸã§ã¯ã䜿çšããã©ã€ãã©ãªã¯é¢ä¿ãããŸããïŒã 1ã€ã®ããŒã§2è¡ãæå·åãã2ã€ã®æå·æ
c1
ãš
c2
ãååŸããŸãã ãã®ã³ãŒãã®ãã¹ãŠãæ£ããã§ããïŒ åœŒã¯çç£ã®æºåãã§ããŠããŸããïŒ èª°ããåé¡ã¯çæéã§å¯èœã ãšèšããããããŸããããããã¯äž»èŠãªåé¡ããã¯ã»ã©é ãã®ã§ãããŒã¯åãããã«äœ¿çšãããååãªé·ãããããšä»®å®ããŸãã
c1
ãåŸæ¥ã®æå·åã¢ãããŒãã§ã¯ããã®äŸã®
c1
ã¯
c2
ãããçããªããŸãã ããã¯é·ããªãŒã¯ãšåŒã°ããŸããå€ãã®å Žåã
c2
ã¯
c1
ãã1ãã€ãé·ããªããŸãã ããã«ãããæ»æè ã¯ããã®æå·åããã¹ããLEFTããŸãã¯ãRIGHTãã§è¡šãããæååãç解ã§ããŸãã ãã®åé¡ã解決ããæãç°¡åãªæ¹æ³ã¯ãäž¡æ¹ã®è¡ã®é·ããåãã«ããããšã§ããããšãã°ãLEFTè¡ã®æåŸã«æåãè¿œå ããŸãã
äžèŠãããšãããé·ãã®æŒãã¯ãå®éã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯çºçãåŸãªãããã倧ãããªåé¡ãšããŠèªèãããŠããŸãã ãããã2018幎1æã«ããTinderã«æå·åããªããããç»é¢ãã¹ã¯ã€ããããšãã«éšå€è ã远跡ã§ããããšããèŠåºãã®äžã§ãã€ã¹ã©ãšã«ã®äŒç€ŸCheckmarxãå®æœãã調æ»ã«ããèšäºãWiredèªã«æ²èŒãããŸããã ã³ã³ãã³ãã«ã€ããŠç°¡åã«èª¬æããŸãããæåã«Tinderæ©èœã®å€§ãŸããªèª¬æãããŸãã Tinderã¯ãåçä»ãã®ã¹ããªãŒã ãåä¿¡ããåçã奜ããã©ããã«å¿ããŠãç»é¢ãå³ãŸãã¯å·Šã«ã¹ã¯ã€ãããã¢ããªã±ãŒã·ã§ã³ã§ãã ç 究è ã¯ãã³ãã³ãèªäœã¯TLSãšHTTPSã䜿çšããŠæ£ããæå·åãããŠããŸãããå³åŽã®ã³ãã³ãã®ããŒã¿ã¯å·ŠåŽã®ããŒã¿ãšã¯ç°ãªããã€ãæ°ãå¿ èŠãšããããšãçºèŠããŸããã ããã¯ãã¡ããè匱æ§ã§ãããããèªäœã¯ããã»ã©éèŠã§ã¯ãããŸããã Tinderã«ãšã£ãŠããéèŠãªã®ã¯ãæå·åãªãã§ãéåžžã®HTTPçµç±ã§åçä»ãã®ã¹ããªãŒã ãéä¿¡ãããšããäºå®ã§ãã ãã®ãããæ»æè ã¯åçã«å¯ŸãããŠãŒã¶ãŒã®åå¿ã ãã§ãªããåçèªäœã«ãã¢ã¯ã»ã¹ããå¯èœæ§ããããŸãã ãããã£ãŠãã芧ã®ãšãããé·ãã®ãªãŒã¯ã¯éåžžã«çŸå®çãªåé¡ã§ãã
次ã«ããã¡ã€ã«ãæå·åããŠã¿ãŸãããã ããã«ã Libsodium.NETãã¡ã€ã«æå·åããŸãã¯ãã£ãšåºãèšãã°ãã¹ããªãŒã æå·åã¯ããã©ã«ãã§ã¯å®è£ ãããŠããããæåã§è¡ããªããã°ãªããªãããšãèšããªããã°ãªããŸããã Infernoã®æ¹ãã¯ããã«åªããŠããŸãã
äžèšã®äŸã¯ãMSDNããã»ãšãã©å€æŽãå ããã«æ®åœ±ããäŸã§ãã ããã¯éåžžã«ç°¡åã§ããããã§ã¯ããœãŒã¹ãã¡ã€ã«çšã®ã¹ããªãŒã ãšå®å ãã¡ã€ã«çšã®ã¹ããªãŒã ã®ã»ããæåã®ã¹ããªãŒã ã2çªç®ã«å€æããæå·åã¹ããªãŒã ããããŸãã ãã®ã³ãŒãã§ã¯ã Inferno㯠1è¡ã§ã®ã¿äœ¿çšãããŸã-å€æãè¡ãããè¡ã§ã ã§ããããç§ãã¡ã®åã«ããã®ã¯ãã¹ããªãŒã ãæå·åããããã®ã·ã³ãã«ãã€åæã«å®å šã«æ©èœãããã¹ãããããœãªã¥ãŒã·ã§ã³ã§ãã
åãããŒã§æå·åããå Žåãã¡ãã»ãŒãžæ°ã«å¶éãããããšã«æ³šæããŠãã ããã ãããã¯Infernoã«ååšãããã®ã©ã€ãã©ãªã§ã¯ç»é¢äžã«æ確ã«æžãããŠããŸãã ããããåæã«ããããã¯ã€ã³ãã§ã«ãã§ã¯éåžžã«å€§ãããããå®éã«ã¯å°éããããšã¯ãããŸããã Libsodium.NETã§ã¯ãå¶éã¯ã¢ã«ãŽãªãºã ããšã«ç°ãªããŸããããã¹ãŠã®å Žåã«ãããŠããããè¶ ããã«ã¯ååã«äœãã§ãã ãããã£ãŠãåã ã®ã·ããªãªã§ããããéæããããã©ããã確èªããå¿ èŠããããŸãã
ãŸããé¢é£ããããŒã¿ã®èªèšŒã«ã€ããŠã説æããå¿ èŠããããŸããããã¯ãããŸãåãäžããããªããããã¯ã§ããããã§ãã ADã¯ã匱ããå¯èœæ§ããããŸããããã¯ãèªèšŒãããŠããããšãæå³ããŸãããæå·åããã³åŸ©å·åããã»ã¹èªäœã«ã¯é¢äžããŠããŸããã å¯Ÿç §çã«ãã匷åãªãADã¯ãã®ããã»ã¹èªäœãå€æŽããŸãã ç§ãç¥ã£ãŠããã»ãšãã©ã®ADã©ã€ãã©ãªã¯è匱ã§ããã Infernoã¯æå·å/埩å·åããã»ã¹èªäœã§ADã䜿çšããã2çªç®ã®ã¢ãããŒãã䜿çšããŠããŸã...
ãŸããé«ã¬ãã«ã®æå·åã®ããã«ã©ã®ã¬ãã«ã®ã»ãã¥ãªãã£ãåªåãã¹ããã«ã€ããŠãæ€èšããå¿ èŠããããŸãã èŠããã«ãç§ã®çãã¯æ¬¡ã®ãšããã§ãã128ãããèªèšŒã¿ã°ã䜿çšãã256ãããæå·åã ããŒããããªã«å€§ããã®ã¯ãªãã§ããïŒ ããã«ã¯å€ãã®çç±ããããŸããããããããéèŠã§ãããæå·ããŒãçæããéã«ãã€ã¢ã¹ãã身ãå®ãå¿ èŠããããšããããšãèŠããŠãããŠãã ããã ãã€ã¢ã¹ã®æå³ã説æããŸãããã ãã€ã¢ã¹ã®ãªãã©ã³ãã ããããžã§ãã¬ãŒã¿ãŒã®å Žåãåãããã«ã€ããŠãå€0ãŸãã¯1ãåãå ¥ãã確çã¯çãããªããŸãã ãããããžã§ãã¬ãŒã¿ã§ããããã50ïŒ ã§ã¯ãªã56ïŒ ã®ç¢ºçã§å€1ãåããšä»®å®ããŸãã äžèŠãããšããããã®ãã€ã¢ã¹ã¯å°ããã§ãããå®éã«ã¯25ïŒ ãšãã倧ããªãã®ã§ãã ããã§ããžã§ãã¬ãŒã¿ãŒã§ç¹å®ã®ãããæ°ãçæãããšãã«åŸããããšã³ããããŒã®éãèšç®ããŠã¿ãŸãããã
åçã«ã¯ããã®èšç®ãè¡ãããåŒã衚瀺ãããŸãã éèŠãªã®ã¯ãå€æ°ã2ã€ãããªãããšã§ãããã§ã«èª¬æãããã€ã¢ã¹ïŒãã€ã¢ã¹ïŒãšããžã§ãã¬ãŒã¿ãŒã«ãã£ãŠäœæããããããæ°ã§ãã ãã€ã¢ã¹ã¯25ïŒ ã§ãããšä»®å®ããŸã-ããã¯éåžžã«æ¥µç«¯ãªã±ãŒã¹ã§ãããå®éã«ã¯ããã®ãããªæªãã ä¹±æ°ãžã§ãã¬ãŒã¿ãŒãåããã·ã¹ãã ã§ã¯åäœããªãå¯èœæ§ããããŸãã 25ïŒ ã®ãã€ã¢ã¹ãš128ãããã®ããŒã䜿çšãããšã53ãããã®ãšã³ããããŒããåŸãããªãå¯èœæ§ããããŸãã 第äžã«ãããã¯éåžžä¹±æ°çºçåšããæåŸ ããã128ããããããå€§å¹ ã«å°ããã第äºã«ãçŸä»£ã®æè¡ã§ã¯ããã®ãããªããŒã¯åçŽã«ãã«ãŒããã©ãŒã¹ã«ãªããŸãã ãã ãã128ãããããŒã®ä»£ããã«256ãããã䜿çšãããšã106ãããã®ãšã³ããããŒãåŸãããŸãã äºæ³ããã256ãããå°ãªããã®ã®ãããã¯æ¢ã«éåžžã«åªããŠããŸããææ°ã®æè¡ã§ã¯ããã®ãããªããŒã解èªããããšã¯ã»ãšãã©äžå¯èœã§ãã
ã¬ããŒãã®æåã®éšåã®æåŸã«ãäžéçµæãèŠçŽããŸãã 誰ããé©åã«äœæãããæå·åAPIã䜿çšããããšããå§ãããŸãã èªåã«åã£ããã®ãèŠã€ããããMicrosoftã«è«é¡æžãéããããªãã«æçŽãæžããŠãã ããã ããã«ãAPIãéžæãããšãã¯ãã¹ã¬ãããæäœããããã®ãµããŒãã®å¯çšæ§ã«æ³šæããå¿ èŠããããŸãã ãã§ã«èª¬æããçç±ã«ãããæå°ããŒé·ã¯256ãããã§ããå¿ èŠããããŸãã æåŸã«ãé«ã¬ãã«æå·åã¯ãä»ã®ãã®ãšåæ§ã«çæ³çã§ã¯ãªãããšãå¿ã«çããŠããå¿ èŠããããŸãã ãªãŒã¯ãçºçããå¯èœæ§ããããã»ãšãã©ã®ã·ããªãªã§ãã®æ©èœã念é ã«çœ®ããŠããå¿ èŠããããŸãã
é察称æå·ããŸãã¯ãã€ããªããæå·ã«ã€ããŠèª¬æããŸãããã ç§ã¯ããªãã¯ã®è³ªåãæããããŸãïŒ.NETã§RSAã䜿çšã§ããŸããïŒ å€ãã®äººãããããããã«ãæ¥ãã§çããŠã¯ãããŸãã-æåã«ãã®åéã§ããªãã®ç¥èããã¹ãããŸãããã 次ã®ã¹ã©ã€ãã¯ããã®ãããã¯ã«ãã§ã«ç²ŸéããŠãã人åãã«ç¹å¥ã«èšèšãããŠããŸãã ããããæåã«ãŠã£ãããã£ã¢ãèŠãŠã誰ãããã®ã¢ã«ãŽãªãºã ãé·ãéå¿ãããã䜿çšããªãã£ãå Žåã«åããŠãRSAãäœã§ããããèŠããŠãããŠãã ããã
ä¹±æ°ãžã§ãã¬ãŒã¿ãŒã䜿çšããŠã1ã€ã®ãã©ã€ããŒããš1ã€ã®ãããªãã¯ãå«ãããŒãã¢ãäœæããã¢ãªã¹ããããšããŸãã 次ã«ãã¢ãªã¹å®ã®ã¡ãã»ãŒãžãæå·åãããããããŸãããããã«ã¡ã¯ãã¢ãªã¹ïŒã圌女ã®å ¬ééµã䜿çšããŠã圌ã¯æå·æãçæããããã圌女ã«éä¿¡ããŸãã 圌女ã¯èªåã®éµã®ç§å¯éšåã䜿çšããŠãã®æå·æã解èªããŸãã
ãã®ã·ããªãªãå®éã«åçŸããŠã¿ãŸãããã
äžèšã§ãããããã«ãRSAã®ã€ã³ã¹ã¿ã³ã¹ãäœæããããã¹ããæå·åããŸãã .NETãããã£ã³ã°ã¢ãŒãã®éžæã匷å¶ããããšã«çŽã¡ã«æ³šæãæã£ãŠãã ããã ãããã¯5ã€ãããŸããããã¹ãŠååã¯ããããŸããã ããããã¹ãŠãé çªã«è©ŠããŠã¿ããšãæåŸã®3ã€ã¯åã«äŸå€ãã¹ããŒããæ©èœããªãããšãããããŸãã æ®ãã®2ã€ã®ãã¡ã®1ã€ã
OaepSHA1
ãŸãã ããã§ãããŒã®ãµã€ãºã¯1ãããããã§ãRSAã«ã¯å°ããããŸãããå®éã«ã¯ãããã³ã°ãããããŒã§ãã ãããã£ãŠãããŒãµã€ãºãæåã§èšå®ããå¿ èŠããããŸãã ããã¥ã¡ã³ããããããŒãµã€ãºãåä¿¡ãŸãã¯èšå®ããç¹å¥ãªããããã£
.KeySize
ãããããšã
.KeySize
ãŸãã
äžèŠãããšãããããã¯ãŸãã«ç§ãã¡ãå¿ èŠãšãããã®ãªã®ã§ã
rsa.KeySize = 3072
æžããŸãã ãããããããŸããªçãã«å°ãããåŸãããŒãµã€ãºãçŸåšäœã«çãããã確èªãããšã1ããããããããããšãããããŸãã éèŠã§ã¯ãããŸãã
WriteLine(rsa.KeySize)
ã¡ãœãããŸãã¯
rsa.ExportParameters(false).Modulus.Length * 8
ã䜿çšããŠãã®ãã©ã¡ãŒã¿ãŒããã§ãã¯ããŸã
rsa.ExportParameters(false).Modulus.Length * 8
åŸè ã®å ŽåãRSAããŒã®ãããªãã¯ã³ã³ããŒãã³ãããšã¯ã¹ããŒããããŸãã ãã®ããŒã®ã¢ãžã¥ã©ã¹ã¯é åã§ãããã«8ãæããŠãããåäœã®ãµã€ãºãååŸããŸã-ããã1ãããããã«ãªããŸãã ã芧ã®ãšããããã®ã¢ã«ãŽãªãºã ã¯ãŸã æ¬çªç°å¢ã«éä¿¡ããã«ã¯æ©ãããŸãã
ãã®APIãæ©èœããªãçç±ãç解ããã®ã«æéãç¡é§ã«ããã代ããã«ãMicrosoftã.NET 4.6ã§æäŸããå¥ã®RSAå®è£ ãã€ãŸãå®å šã«æ°ãããã®ãè©ŠããŠãã ããã RSACngãšåŒã°ãã Cngã¯æ¬¡äžä»£æå·åã®ç¥ã§ãã 次äžä»£ã®ããŒã«ã䜿ããããªã人ã¯ããŸããïŒ ãã£ãšããã§ãã¹ãŠã®åé¡ã«å¯Ÿããéæ³ã®è§£æ±ºçãèŠã€ããã§ãããã
RSACngã®ã€ã³ã¹ã¿ã³ã¹ãèŠæ±ããåã³ããŒãµã€ãºã3ãããããã«èšå®ããåã³
WriteLine(rsa.KeySize)
ããŒãµã€ãºã確èªããŸããããŒãµã€ãºããŸã 1ãããããã«çããããšã確èªããŸãã ããã«ãããŒãçæãããªããžã§ã¯ãã®ã¿ã€ãããªã¯ãšã¹ãããå Žå-æãåºããããã«ãRSACngã®ã€ã³ã¹ã¿ã³ã¹ããªã¯ãšã¹ãããŸãã-RSACryptoServiceProviderã§ããããšãããããŸãã ç§ã¯èªåã®çµ¶ææãããã§å ±æãããã ãã§ãããªããã€ã¯ããœãããªã®ãïŒããšå«ã¶ã ãã§ãã
é·ãèŠçãšèŠçã®åŸãå®éã«ã¯å·¥å Žã§ã¯ãªããã¶ã€ããŒã䜿çšããå¿ èŠãããããšãããããŸãã
ããã§ãããã©ã«ãã®ããŒãµã€ãºã®å€ã¯2048ãããã§ãããããã¯ãã§ã«ã¯ããã«åªããŠããŸãã ããã«è¯ãããš-ããã§ãããããããŒãµã€ãºã3ãããããã«èšå®ããããšãã§ããŸãã 圌ããèšãããã«ãææã¯ã¢ã³ããã¯ãããŸããã
ãããŸã§ã®ãã¹ãŠã®åªåã¯RSAã®äœæã«ã®ã¿è»œæžãããæå·åã¯ãŸã éå§ãããŠããŸãããæåã«çããå¿ èŠããã質åããŸã ãããŸãããŸã第äžã«ãããã©ã«ãã®ããŒãµã€ãºã«ã©ã®çšåºŠãŸã§äŸåã§ããŸããïŒRSAãã¡ã¯ããªã®å®è£ ã¯ã§ãªãŒããŒã©ã€ããããå¯èœæ§ããã
machine.config
ãããç¥ããªããã¡ã«å€æŽãããå ŽåããããŸãïŒããšãã°ãã·ã¹ãã 管çè ãå€æŽããå ŽåããããŸãïŒãããã¯ãããã©ã«ãã®ããŒãµã€ãºãå€æŽã§ããããšãæå³ããŸãããããã£ãŠãããã©ã«ãã§æäŸãããå€ãä¿¡é Œããã¹ãã§ã¯ãããŸãããããŒãµã€ãºã¯åžžã«ç¬ç«ããŠèšå®ããå¿ èŠããããŸãã次ã«ãããã©ã«ãã®RSAããŒã®ãµã€ãºã¯ã©ããããã§ããïŒ.NETã«ã¯2ã€ã®RSAå®è£ ãããã1ã€ã¯ããŒã¹
RSACryptoServiceProvider
ããã1ã€ã¯ããŒã¹
RSACng
. 1 , . Bitcoin (BCN). , Bitcoin , . hashrate, 2 64 . 2 90 . , â , . , , , , 2 70 ( BCN) , 1- RSA, 2 90 ( BCN) â 2- . â , . , 3 , â 4.
.NET , .
RSA,
RSACryptoServiceProvider
,
RSACng
, 4 . , . , API â , , . , , , , . RSA , . , API .
, RSA , ; - .
, (
data
), , . . ; ? â Microsoft, , . , . . , . , , . . .
, , SHA-1? SHA-1, , - , - (compliance department) , .
OaepSHA1
OaepSHA256
, .
. , , , , .
, , .
int GetMaxDataSizeForEnc(RSAEncryptionPadding pad)
, , . , , . , , RSA, . , Microsoft.
, RSA , . , , , API RSA .NET . , , . , 128- 4- . , -, -. . 256- , â 15360 . RSA . . RSA , , , . ? TLS RSA, . , , , , , . , RSA.
, RSA? . ECDSA (Digital Signature Algorithm, « »), RSA . EC â , Elliptic-Curve («»). securitydriven.net/inferno/#DSA Signatures ECDSA, , , .NET. â ECIES (Integrated Encryption Scheme, « »). RSA, , , . securitydriven.net/inferno/#ECIES example. , â ECDH (Diffie-Hellman key exchange, « -»). . ( forward secrecy ). securitydriven.net/inferno/#DHM Key Exchange .
. API, , . RSA. , , , , . RSA. , (ECDSA, ECDH, ECIES). , , , , . StackOverflow, : « . ».
, , , . SecurityDriven.Inferno . « » - (Jean-Philippe Aumasson, Serious Cryptography). . , Application Security in .NET, Succinctly, . .NET. , Slideshare , , .
, . -, , . . .NET â CSRF (Cross-Site Request Forgery, « »), , . â , . , GET. CSRF, HTML «hidden». , cookie-, . POST, . , -, , , -, . . , ASP.NET ASP.NET Core. , CSRF .
, CSRF . , â , , , . . , (injection) , . â , AJAX, â . , , , .
, â . , , . , .
åºåã®åã DotNext. DotNext 2018 Moscow â 22-23 2018 - « ».
. , , . ! .