/**
获取随机密码
date的格式是年月日yymmdd,privatyKey为10位左右的字母数字组合串
1.需要返回8位纯数字
2.须使用date,privatyKey来生成
3.每次调用都是随机生成的(在date、privatyKey相同的情况下,返回的结果也要不同),尽量保证低重复率
**/
getPassword(date,privatyKey){
}
/**
检测密码
getPassword生成的密码可以通过检测,随便输入的密码通不过检测
**/
checkPassword(date,privatyKey,password){
}
有什么合适的算法?
으아아아
피할 수 없는 문제: 8자리 숫자(
1e8 或 2^30
)로 저장할 수 있는 것이 너무 적습니다.따라서 이 방법은 소모에 거의 완전히 면역됩니다. 공격자는 처음 3비트만 수정하고 마지막 5비트만 소모하면 됩니다.
사용 시 알고리즘 자체를 비밀로 유지하거나 시도 횟수 등의 제한을 추가해야 합니다.
탈진 난이도를 약간 높이는 변형:
으아아아은
으아악(date, pkey)
에서 미리 만들어진 해시 함수(예: sha256)를 사용할 수 있습니다. 결과는 일반적으로 8자리보다 훨씬 많은 순수 숫자 정보입니다. 이 정보를 작은 조각으로 나누고 무작위로 한 조각을 반환합니다.MD5를 사용해 보세요
매번 다른 결과를 반환하고 싶다면 TripleDes를 사용할 수 있습니다
그런데 결과는 8자리 순수 숫자밖에 나오지 않아서 당황스럽습니다
md5, openssl은 상대적으로 간단합니다
최종 솔루션은 해싱 후 값의 일부를 차지합니다