License java
public abstract class MyRSACoder {
public static final String KEY_ALGORITHM = "RSA";
public static final String KEY_PROVIDER = "BC";
public static final String SIGNATURE_ALGORITHM = "SHA1WithRSA";
/**
*
*/
public static Map initKeys(String seed) throws Exception {
Map keyMap = new HashMap();
Security.addProvider(new BouncyCastleProvider());
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(KEY_ALGORITHM,KEY_PROVIDER);
keyPairGenerator.initialize(1024,new SecureRandom(seed.getBytes()));
KeyPair pair = keyPairGenerator.generateKeyPair();
RSAPublicKey rsaPublicKey = (RSAPublicKey) pair.getPublic();
RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) pair.getPrivate();
KeyFactory factory = KeyFactory.getInstance(KEY_ALGORITHM,KEY_PROVIDER);
RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(new BigInteger(rsaPublicKey.getModulus().toString()),new BigInteger(rsaPublicKey.getPublicExponent().toString()));
RSAPrivateKeySpec priKeySpec = new RSAPrivateKeySpec(new BigInteger(rsaPrivateKey.getModulus().toString()),new BigInteger(rsaPrivateKey.getPrivateExponent().toString()));
PublicKey publicKey = factory.generatePublic(pubKeySpec);
PrivateKey privateKey = factory.generatePrivate(priKeySpec);
System.out.println(" :" + pubKeySpec.getModulus() + "----" + pubKeySpec.getPublicExponent());
System.out.println(" :" + priKeySpec.getModulus() + "----" + priKeySpec.getPrivateExponent());
keyMap.put("publicKey", publicKey);
keyMap.put("privateKey", privateKey);
return keyMap;
}
/**
*
* */
public static byte[] encryptRSA(byte[] data,PrivateKey privateKey) throws Exception {
Cipher cipher = Cipher.getInstance(KEY_ALGORITHM,KEY_PROVIDER);
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
int dataSize = cipher.getOutputSize(data.length);
int blockSize = cipher.getBlockSize();
int blockNum = 0;
if (data.length % blockSize == 0) {
blockNum = data.length / blockSize;
} else {
blockNum = data.length / blockSize + 1;
}
byte[] raw = new byte[dataSize * blockNum];
int i = 0;
while (data.length - i * blockSize > 0) {
if (data.length - i * blockSize > blockSize) {
cipher.doFinal(data, i * blockSize, blockSize, raw, i * dataSize);
} else {
cipher.doFinal(data, i * blockSize, data.length - i * blockSize, raw, i * dataSize);
}
i++;
}
return raw;
}
/**
*
* */
public static String sign(byte[] encoderData,PrivateKey privateKey) throws Exception {
Signature sig = Signature.getInstance(SIGNATURE_ALGORITHM,KEY_PROVIDER);
sig.initSign(privateKey);
sig.update(encoderData);
return new String(Base64.encode(sig.sign()));
}
/**
*
* */
public static boolean verify (byte[] encoderData,String sign,PublicKey publicKey) throws Exception {
Signature sig = Signature.getInstance(SIGNATURE_ALGORITHM,KEY_PROVIDER);
sig.initVerify(publicKey);
sig.update(encoderData);
return sig.verify(Base64.decode(sign));
}
main
public class MyRSACoderTest {
public static void main(String[] args) throws Exception {
Map keyMap = MyRSACoder.initKeys("0");
PublicKey publicKey = (PublicKey) keyMap.get("publicKey");
PrivateKey privateKey = (PrivateKey) keyMap.get("privateKey");
String str = " !";
byte[] encoderData = MyRSACoder.encryptRSA(str.getBytes(), privateKey);
String sign = MyRSACoder.sign(encoderData, privateKey);
boolean status = MyRSACoder.verify(encoderData, sign, publicKey);
System.out.println(" :" + str);
System.out.println(" :" + new String(encoderData));
System.out.println(" :" + sign);
System.out.println(" :" + status);
}
}
자바 에서 공개 키 암호 화 비밀 키 복호화 원 리 를 사용 하여 license 통 제 를 실현 합 니 다.
현재 많은 J2EE 응용 프로그램 은 하나의 license 파일 로 시스템 의 사용 을 권한 을 부여 한다. 특히 시스템 구 매 초기 에 제 한 된 license 파일 을 제공 하여 시스템 에 대해 제한 을 할 것 이다. 예 를 들 어 시용 판 은 IP, 날짜, 최대 사용자 수의 제한 등 이 있다.그리고 license 제어 방법 도 많 습 니 다. 현재 유행 하고 있 습 니 다. 디자인 만 잘 하면 풀기 어 려 운 방법 은 한 쌍 의 밀 스푼 (밀 스푼 암호 화 된 밀 스푼 복호화) 으로 License 파일 의 Sinature 서명 내용 을 만 들 고 Base 64 나 Hex 를 통 해 인 코딩 하 는 것 입 니 다.예 를 들 어 원래 BEA 회사 가 현재 Oracle 회사 의 WebLogic 인 데 이런 방법 으로 License 파일 을 설정 합 니 다.
여 기 는 비교적 간단 한 실현 만 진행 합 니 다.
모두 세 가지 종류 가 있 습 니 다.
A. KeyGenerator 클래스 생 성 공개 키 비밀 키 쌍
B. Signaturer 클래스 는 비밀 키 를 사용 하여 서명 합 니 다.
C. SignProvider 클래스 용 공개 키 검증
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.