ããã«ã¡ã¯ãhabraparanoikïŒ ä»æ¥ã¯ãã»ãã¥ãªãã£ã匷åããå°ãå€ãã£ãæ¹æ³ãã€ãŸã
ãã¹ã¯ãŒãããã·ã¥ãé
ãããæ¹æ³ã«ã€ããŠèª¬æ
ããŸã ã åšãã®èª°ããæé©åããããšããŠãããšãã«ããªãäœããé
ãããããã«æããŸããïŒ
å°ãªããšããã®ãšããæãè¶
倧åã®ä¿è·ãããã·ã¹ãã ã§ãã£ãŠããæã匱ããªã³ã¯ã¯äººã®ãŸãŸã§ãã ã€ãŸãã圌ã®ãã¹ã¯ãŒãã
æå·åãããrarã¢ãŒã«ã€ããã¯ã©ãã¯ããããšããããšã¯ãããŸããïŒ ãŸãã1ç§éã«ããã€ã®ãã¹ã¯ãŒããééããŸãããïŒ 50-100-200ïŒ åªããGPUã§ããæªåé«ãcRARkã䜿çšãããšãæ€çŽ¢é床ã¯çŽ2400ãªãã·ã§ã³/ç§ã«ãªããŸãã ããã¯ãzip / md5 / SHA1ã®1ç§ãããæ°åïŒæ°åïŒã®ãã¹ã¯ãŒããšæ¯èŒãããŸãã
ã«ããã®äžã§ããã®ããã»ã¹ã®ç§ã®èªç±ãªè§£éã
ã¢ã¯ã·ã§ã³å
šäœã®æå³ã¯æ¬¡ã®ãšããã§ãã
- æå·åããŒã¯ãã¹ã¯ãŒãã§ã¯ãªããããããã®ïŒé
ãïŒããã·ã¥ãéèŠã§ã
- ãã¹ã¯ãŒãããã£ãã·ã¥ãããŠããéããŠãŒã¶ãŒã1ç§ååŸ
ã€å¿
èŠã¯ãããŸããã
- ãããããã¢ã»ãã«ãŒããã©ãŒãµã¹ã¯å¿è匷ããªããã°ãªããŸãã
ã¯ãã
ç ç³ãš å¡©ã䜿çšããã·ã¹ãã ã§ãéåžžã«ããŸãçæããããã¿ããªã®ãæ°ã«å
¥ãã®
ã¬ã€ã³ããŒããŒãã«ã«ã€ããŠã¯ã»ãšãã©å¿ããŠããŸããã 圌ãã®äžä»£ã¯ãŸãã圹ã«ç«ããªããšããŠããéåžžã«åŽåéçŽçã«ãªããŸãã
ç§ã¯å¡©ã®ã·ã¹ãã ãæªããšèšã£ãŠããã®ã§ã¯ãªããåã«åŒ·åããããš
ãã§ã
ãŸã ã
ãããŠãå¡©ãããããã¹ã¯ãŒãããããŸãã 次ã¯ïŒ
ãããŠããã¹ãŠãéåžžã«ç°¡åã§ãïŒ
- ãœã«ããšãã¹ã¯ãŒããé£çµãã
- ããã·ã¥ãçµæãèŠããŠãã
- ïŒå€ãã®å ŽåïŒ{
- äžžãå¡©ãçæãã
- é£çµããŠããã·ã¥ãã
- ãã£ãã·ã¥ãçµæãèŠãã}
Winrarã§ã¯ïŒã¡ãªã¿ã«ãã€ã³ã¹ãã¬ãŒã·ã§ã³ãããã圌ã«æè¬ããŸãïŒãç§ã®èšæ¶ãç§ã«åœ¹ç«ã€ãªããäžžãå¡©ã¯å埩æ°ã§ãã ç§ã¯
ããå°ãé²ãã ã
ã ãããã³ãŒãã
BouncyCastleã©ã€ãã©ãªã䜿çšããŠãã¹ãŠãJavaã§èšè¿°ãããŠããŸãããææ
®æ·±ãhabraparanoikããããTuringã§å®å
šãªããã°ã©ãã³ã°èšèªã«è»¢éããïŒãããŠããããç¬èªã®ãã®ãè¿œå ããïŒããšã¯é£ãããããŸããã ããã«ãCïŒçšã®BouncyCastleããããŸãã
1. 2ã€ã®ããã·ã¥ã¢ã«ãŽãªãºã ïŒSHA-256ããã³SHA-512ïŒã䜿çšããŠãããããåå¿è
ã«ã¯ãã®ã€ã³ã¿ãŒãã§ã€ã¹å
šäœãå€ããå°ãªããæ±çšåããã®ã«åœ¹ç«ã€å°ããªã€ã³ã¿ãŒãã§ã€ã¹ããããŸãã
ãããªã㯠ã€ã³ã¿ãŒãã§ã€ã¹ IDigest
{
ãããªã㯠ãã€ã []ããã»ã¹ïŒ ãã€ã []ããŒã¿ïŒ;
public int getSizeïŒïŒ;
}
2. SHA-256ã¢ã«ãŽãªãºã çšã®ãã®ã€ã³ã¿ãŒãã§ãŒã¹ã®å®è£
äŸïŒ
BouncyCastleã©ã€ãã©ãªã®
SHA256Digestã¯ã©ã¹ã䜿çšïŒïŒ
ãããªã㯠ã¯ã©ã¹ SHA256ã¯IDigestãå®è£
ããŸã
{
ãã©ã€ããŒã SHA256Digest m_SHA256 = æ°ãã SHA256DigestïŒïŒ;
@Override
ãããªã㯠ãã€ã []ããã»ã¹ïŒ ãã€ã []ããŒã¿ïŒ
{
m_SHA256.resetïŒïŒ;
m_SHA256.updateïŒdataã0ãdata.lengthïŒ;
ãã€ã []çµæ= æ°ãã ãã€ã [m_SHA256.getDigestSizeïŒïŒ];
m_SHA256.doFinalïŒçµæã0ïŒ;
çµæãè¿ã ;
}
@Override
public int getSizeïŒïŒ
{
return m_SHA256.getDigestSizeïŒïŒ;
}
}
3.æãããããã 詳现ã«èª¬æããŸãã
ãããªã㯠ã¯ã©ã¹ SlowHasher
{
private final static int BITS_IN_BYTE = 8;
private static final int [] s_primeIndices = new int [] {7ã11ã17ã23ã31ã41ã47ã53ã61};
/ **
*ãã®ã¡ãœããã¯ãã¹ã¯ãŒãã0x50000åããã·ã¥ããåã©ãŠã³ãã«ã©ãŠã³ããœã«ããè¿œå ããŸã
*
* ãã©ã¡ãŒã¿ãŒãã€ãžã§ã¹ã
* ãã©ã¡ãŒã¿ãã¹ã¯ãŒã
* æ»ã
* /
ãããªã㯠ãã€ã [] CalculateSlowHashïŒIDigestãã€ãžã§ã¹ãã æååãã¹ã¯ãŒãã ãã€ã []ãœã«ãïŒ
{
int roundSaltSize = digest.getSizeïŒïŒ/ BITS_IN_BYTE;
ãã€ã [] bPasswd = password.getBytesïŒïŒ;
ãã€ã [] toHash = æ°ãã ãã€ã [bPasswd.length + salt.length];
/ *
*ããã·ã¥ããããã€ãã®é
åãæ§æãã
* /
System.arraycopyïŒsaltã0ãtoHashã0ãsalt.lengthïŒ;
System.arraycopyïŒbPasswdã0ãtoHashãsalt.lengthãbPaââsswd.lengthïŒ;
ãã€ã [] res = digest.processïŒtoHashïŒ;
byte [] temp = æ°ãã ãã€ã [res.length + roundSaltSize];
for ïŒ int i = 0; i <0x50000; i ++ïŒ
{
System.arraycopyïŒresã0ãtempã0ãres.lengthïŒ;
/ ***
*å¡©ã®èšç®
* /
for ïŒ int j = 0; j <roundSaltSize; j ++ïŒ
{
int btmp = res [s_primeIndices [j]]ïŒ0xFF;
for ïŒ int k = 1; k <BITS_IN_BYTE; k ++ïŒ
{
btmp = rorïŒïŒbtmp +ïŒres [rorïŒbtmpãkïŒïŒ
res.length]ïŒ0xFFïŒïŒïŒ
256ãBITS_IN_BYTE-kïŒ;
}
temp [res.length + j] =ïŒ byte ïŒbtmp;
}
res = digest.processïŒtempïŒ;
}
解å床ãè¿ã ;
}
/ **
*å
¥åããã€ããšããŠæ±ããããããå³ã«å転
*ãã©ã¡ãŒã¿ãŒå€0 <=å€<= 255
* param nã·ãããããããæ°
* æ»ã
* /
public static int rorïŒ int value ã int nïŒ
{
return ïŒïŒ å€ >>ïŒnïŒ
BITS_IN_BYTEïŒïŒ|ïŒïŒ å€ <<ïŒ8-ïŒnïŒ
BITS_IN_BYTEïŒïŒïŒïŒ0xFFïŒïŒ;
}
}
javaã«æ
£ããŠããªã人ã¯ãå€æ°ã®æ¿å
¥& 0xFF
æãã£ãŠã¯ãããªããšããã«èšãã§ãããã ããã¯ãintã«å€æãããã®ãããªããããã¹ã¯ãé©çšããããšã«ããã笊å·ä»ããã€ãã笊å·ãªããã€ãã«å€æããã ãã§ãã ãããŠãã¹ãŠã®çç±ã¯ãJavaã«ã¯ç¬Šå·ãªãã®åããªãããã§ãïŒ çµ¶å¯Ÿã«ïŒ ããŠãããã¯èŽåœçã§ã¯ãããŸããã
ããã§ã®ãã¹ãŠã®çŸããã¯äžžãå¡©ã®åœ¢æã§ãããããäž»ãªæ³šæãæãããŸãã
å€æ°ã«ã€ããŠå°ãïŒ
- resã¯ãSHA-256ã§ã¯32ãã€ããSHA-512ã§ã¯64ãã€ãã®é
åã§ãã ããã·ã¥çµæãä¿åããŸã
- roundSaltSize-äžžãå¡©ã®ãµã€ãºã SHA-256ã®å Žåã¯4ãã€ããSHA-512ã®å Žåã¯8ãã€ã
- temp -resé
åãµã€ãºèŠçŽ ãšã©ãŠã³ããœã«ããµã€ãºã®é
åroundSaltSize
- s_primeIndices -resé
åå
ã®èŠçŽ ã®ã€ã³ããã¯ã¹ã®é
åããã®é
åããéå§ããŠãã©ãŠã³ããœã«ãã®å¯Ÿå¿ãããã€ããèšç®ããŸãã ã€ãŸããres [7]ã§SHA-256ã®ã©ãŠã³ããœã«ãã®æåã®ãã€ããres [11]ã§2çªç®ã®ãã€ãã®èšç®ãéå§ããŸãã SHA-512ã®å Žåããã¹ãŠã®ã€ã³ããã¯ã¹ãé¢ä¿ããŸã
- btemp-äžé£ã®ããªãããŒãªå€æã®åŸãã©ãŠã³ããœã«ãã®æå®ã®äœçœ®ã«åãŸããã€ã
ã©ãŠã³ããœã«ãã¢ã«ãŽãªãºã ã®åœ¢æã®èª¬æã«ç§»ãåã®å¥ã®çºèšã ã¢ã«ãŽãªãºã å
šäœã¯ãç§åŠçãªç 究ãšãã¹ãã®çµæã§ã¯ãããŸããã çµæã®ããã·ã¥ã®ããã€ãã®ãã€ãã«äŸåããå€ã圢æãããããé
ãããŠè€éã«ããã®ãå©ããããã«äœæãããŸããã ããŠãä»ã®èª¬æïŒ
- æåã«ãã¡ã€ã³ã®ãœã«ããšãã¹ã¯ãŒãã¯toHashé
åã«åéãããŸã
- toHashé
åã¯ããã·ã¥ãããçµæã¯resé
åã«ä¿åãããŸãã åºæ¬çãªãœã«ããšãã¹ã¯ãŒãã«é¢ãããã¹ãŠãå¿ããããŸãã
- 0x50000ã®ç¹°ãè¿ãã§é·ããµã€ã¯ã«ãéå§ããŸã
- 次ã«ãresé
åãã³ããŒããtempé
åã䜿çšããŸãã tempé
åã®æåŸã«ãsaltçšã®4ãŸãã¯8ãã€ãããŸã ãããŸãã ããããèšå
¥ããå¿
èŠããããŸã
- ã©ãŠã³ããœã«ããã€ãããšã«ïŒ
- çŸåšã®ãã€ãæ°ïŒjïŒã«å¿ããŠãã€ã³ããã¯ã¹ïŒ7ã11ã17 ...ïŒã®ããããã«ããèŠçŽ ãbtmpã«æ ŒçŽããŸã
- 次ã«ã次ã®7ïŒkïŒåå®è¡ããŸãã
- btmpã®åå²ããæ®ããååŸããŸããbtmpã®ãããã¯ãresé
åã®é·ãã ããkäœçœ®ã ãå³ã«ã·ãããããŸã
- åã®çªå·ãresé
åã®ã€ã³ããã¯ã¹ãšããŠäœ¿çšãããã®ã€ã³ããã¯ã¹ã§çªå·ãåŒãåºããŸã
- btmpã¯ãã®çªå·ãå²ãåœãŠã256ãæ³ãšããbtmpã«è¿œå ãã8 kããããã€å³ã«ã¹ã¯ããŒã«ããŸã
- tempé
åã®ããã·ã¥ã®åŸã«btmpã眮ããŸã
- ããã·ã¥æž©åºŠ
ãã®ã¡ãœããã®åŒã³åºãã¯æ¬¡ã®ãšããã§ãã
ãã€ã []ãœã«ã= æ°ãã ãã€ã [16];
new SecureRandomïŒïŒãnextBytesïŒsaltïŒ; //ã©ã³ãã ãª16ãã€ãã®ãœã«ããçæããŸã
byte [] hashedPassword = new SlowHasherïŒïŒãcomputeSlowHashïŒ new SHA256ïŒïŒãpasswordãsaltïŒ;
çµæã¯ããã·ã¥ïŒããã·ã¥ïŒããã·ã¥+ã©ãããœã«ãïŒ+ã©ãŠã³ããœã«ãïŒ...ã§ããããã¯ãããšãã°AES-256ã®éèŠãªæ
å ±ã®256ãããæå·åããŒãšããŠäœ¿çšã§ããŸãã
ç§ã®ãã·ã³ïŒC2D 2.6ïŒã§ã¯ã1ã€ã®ããã·ã¥ãçæããã®ã«çŽ0.25ç§ããããŸãã 圌ãã®ãããžã§ã¯ãã§ã ã©ãŠã³ãæ°ãå¢ãããšãããã«å¿ããŠæéãé·ããªããŸãã
å°æ¬ãããäžè¬ã®äººã
ã«ãšã£ãŠèå³æ·±ããã®ã§ããã°ã察称/é察称æå·åã蚌ææžçæãªã©ãBouncyCastleã©ã€ãã©ãªã®æäœã«é©çšãããä»ã®åŽé¢ã«ã€ããŠèª¬æã§ããŸãã
UPDïŒ
ã³ã¡ã³ãã¯ããã¯ãžã®ãªã³ã¯ã瀺ããŠããããã®çš®ã®ã¹ããŒã ã¯ããã«åºãç¯å²ãåããŸã